Quel bouton Radio dans le groupe est coché?

En utilisant WinForms; Existe-t-il un meilleur moyen de trouver le RadioButton vérifié pour un groupe? Il me semble que le code ci-dessous ne devrait pas être nécessaire. Lorsque vous cochez un RadioButton différent, il sait lequel décocher... il devrait donc savoir lequel est coché. Comment puis-je tirer cette information sans faire beaucoup d'instructions if (ou un commutateur).

     RadioButton rb = null;

     if (m_RadioButton1.Checked == true)
     {
        rb = m_RadioButton1;
     }
     else if (m_RadioButton2.Checked == true)
     {
        rb = m_RadioButton2;
     }
     else if (m_RadioButton3.Checked == true)
     {
        rb = m_RadioButton3;
     }
110
demandé sur SLaks 2009-11-25 18:57:48

12 réponses

Vous pouvez utiliser LINQ:

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);

Notez que cela nécessite que tous les boutons radio soient directement dans le même conteneur (par exemple, panneau ou formulaire), et qu'il n'y ait qu'un seul groupe dans le conteneur. Si ce n'est pas le cas, vous pouvez faire List<RadioButton>s dans votre constructeur pour chaque groupe, puis écrire list.FirstOrDefault(r => r.Checked).

201
répondu SLaks 2009-11-25 16:02:46

Vous pouvez câbler le CheckedEvents de tous les boutons contre un gestionnaire. Là, vous pouvez facilement obtenir la case à cocher correcte.

// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
    // Check of the raiser of the event is a checked Checkbox.
    // Of course we also need to to cast it first.
    if (((RadioButton)sender).Checked) {
        // This is the correct control.
        RadioButton rb = (RadioButton)sender;
    }
}
31
répondu Bobby 2013-04-18 07:10:37

Pour ceux sans LINQ:

RadioButton GetCheckedRadio(Control container)
{
    foreach (var control in container.Controls)
    {
        RadioButton radio = control as RadioButton;

        if (radio != null && radio.Checked)
        {
            return radio;
        }
    }

    return null;
}
25
répondu João Angelo 2009-11-25 16:09:57

L'OP voulait obtenir le RadioButton vérifié par groupe. Bien que la réponse de @SLaks soit excellente, elle ne répond pas vraiment à la question principale de L'OP. Pour améliorer la réponse de @SLaks, il suffit de prendre le LINQ un peu plus loin.

Voici un exemple de mon propre code de travail. Par WPF normal, mes RadioButtons sont contenus dans une grille (nommée "myGrid") avec un tas d'autres types de contrôles. J'ai deux groupes de RadioButton différents dans la grille.

Pour obtenir le RadioButton vérifié d'un particulier groupe:

List<RadioButton> buttons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();

Si votre code a la possibilité qu'aucun bouton radio ne soit vérifié, utilisez " SingleOrDefault()."(Si je n'utilise pas de boutons à trois états, alors je mets toujours un bouton "IsChecked" comme sélection par défaut.)

10
répondu D'Hag 2013-08-29 19:01:59

Vous pouvez utiliser l'événement CheckedChanged pour tous vos RadioButtons. {[0] } sera les RadioButtons non cochés et cochés.

5
répondu tanascius 2009-11-25 16:03:52

Vous pouvez utiliser une méthode D'Extension pour itérer le parent du RadioButton.Contrôle la collection. Cela vous permet d'interroger d'autres RadioButtons dans la même portée. En utilisant deux méthodes d'extension, vous pouvez utiliser la première déterminer si des RadioButtons dans le groupe sont sélectionnés, puis utiliser la seconde pour obtenir la sélection. Le champ de balise RadioButton peut être utilisé pour contenir une énumération pour identifier chaque RadioButton dans le groupe:

    public static int GetRadioSelection(this RadioButton rb, int Default = -1) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return Int32.Parse((string)r.Tag);
        }
        return Default;
    }

    public static bool IsRadioSelected(this RadioButton rb) {
        foreach(Control c in  rb.Parent.Controls) {
            RadioButton r = c as RadioButton;
            if(r != null && r.Checked) return true;
        }
        return false;
    }

Voici un modèle d'utilisation typique:

if(!MyRadioButton.IsRadioSelected()) {
   MessageBox.Show("No radio selected.");
   return;
}
int selection = MyRadioButton.GetRadioSelection;
1
répondu James McManus 2012-04-14 14:48:21

Parfois, dans des situations comme celle-ci, ma jeunesse me manque, quand L'accès était mon poison de choix, et je pouvais donner à chaque bouton radio d'un groupe sa propre valeur.

Mon hack en C # est d'utiliser la balise pour définir la valeur, et quand je fais une sélection dans le groupe, je lis la valeur de la balise du radiobutton sélectionné. Dans cet exemple, directionGroup est le groupe dans lequel j'ai quatre cinq boutons radio avec "None" et "NE"," SE"," NW "et" SW " comme balises sur les quatre autres radiobuttons.

J'ai utilisé de manière proactive un bouton pour capturer la valeur du bouton vérifié, car l'affectation d'un gestionnaire d'événements à tous les événements CHeckCHanged des boutons provoque le déclenchement de chaque bouton, car en changer un Les change tous. Ainsi, la valeur de sender est toujours le premier RadioButton du groupe. Au lieu de cela, j'utilise cette méthode quand j'ai besoin de savoir laquelle est sélectionnée, avec les valeurs que je veux récupérer dans la propriété Tag de chaque RadioButton.

  private void ShowSelectedRadioButton()
    {
        List<RadioButton> buttons = new List<RadioButton>();
        string selectedTag = "No selection";
        foreach (Control c in directionGroup.Controls)
        {
            if (c.GetType() == typeof(RadioButton))
            {
                buttons.Add((RadioButton)c);
            }
        }
        var selectedRb = (from rb in buttons where rb.Checked == true select rb).FirstOrDefault();
        if (selectedRb!=null)
        {
             selectedTag = selectedRb.Tag.ToString();
        }

        FormattableString result = $"Selected Radio button tag ={selectedTag}";
        MessageBox.Show(result.ToString());
    }

POUR INFO, JE j'ai testé et utilisé cela dans mon travail.

Joey

1
répondu Joseph Morgan 2016-05-26 21:34:31

Si vous voulez enregistrer la sélection dans un fichier ou autre et l'appeler plus tard, voici ce que je fais

string[] lines = new string[1];

lines[0]  = groupBoxTes.Controls.OfType<RadioButton>()
            .FirstOrDefault(r => r.Checked).Text;

File.WriteAllLines("Config.ini", lines);

Puis appelez-le avec

string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;
0
répondu ewwink 2013-10-13 21:18:24

En plus du câblage CheckedChangedEvent, on peut utiliser la propriété Controls " Tag " pour distinguer les boutons radio... une alternative (code spaghetti) serait la propriété "TabIndex"; P

0
répondu Binkan Salaryman 2013-12-05 20:28:59

Si vous voulez obtenir l'index du bouton radio sélectionné dans un contrôle, vous pouvez utiliser cette méthode:

public static int getCheckedRadioButton(Control c)
{
    int i;
    try
    {
        Control.ControlCollection cc = c.Controls;
        for (i = 0; i < cc.Count; i++)
        {
            RadioButton rb = cc[i] as RadioButton;
            if (rb.Checked)
            {
                return i;
            }
        }
    }
    catch
    {
        i = -1;
    }
    return i;
}

Exemple d'utilisation:

int index = getCheckedRadioButton(panel1);

Le code n'est pas si bien testé, mais il semble que l'ordre des index soit de gauche à droite et de haut en bas, comme lors de la lecture d'un texte. Si aucun bouton radio n'est trouvé, la méthode renvoie -1.

Mise à jour: il S'est avéré que ma première tentative n'a pas fonctionné s'il n'y a pas de bouton radio à l'intérieur du contrôle. J'ai ajouté un bloc try and catch pour résoudre ce problème, et la méthode semble fonctionner.

0
répondu matsolof 2013-12-06 07:49:48

Le GroupBox a un événement validé à cet effet, si vous utilisez WinForms.

private void grpBox_Validated(object sender, EventArgs e)
    {
        GroupBox g = sender as GroupBox;
        var a = from RadioButton r in g.Controls
                 where r.Checked == true select r.Name;
        strChecked = a.First();
     }
0
répondu Bede Amarasekara 2018-03-12 15:28:16

Pour les développeurs utilisant VB.NET


Private Function GetCheckedRadio(container) As RadioButton
    For Each control In container.Children
        Dim radio As RadioButton = TryCast(control, RadioButton)

        If radio IsNot Nothing AndAlso radio.IsChecked Then
            Return radio
        End If
    Next

    Return Nothing
End Function
0
répondu Nick4814 2018-09-06 02:46:55