132 votes

Quel bouton radio du groupe est coché ?

Utilisation de WinForms ; Existe-t-il une meilleure façon de trouver le RadioButton coché pour un groupe ? Il me semble que le code ci-dessous ne devrait pas être nécessaire. Lorsque vous cochez un autre bouton radio, il sait lequel décocher donc il devrait savoir lequel est coché. Comment puis-je obtenir cette information sans faire beaucoup d'instructions if (ou un switch) ?

     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;
     }

1 votes

Le code sous-jacent ne sait pas lequel décocher, il itère simplement tous les contrôles RadioButton sous le même parent du contrôle modifié et décoche celui qui était précédemment coché.

1 votes

Utilisez-vous WinForms ou ASP.Net ?

239voto

SLaks Points 391154

Vous pourriez 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, Panel ou Form), et qu'il n'y ait qu'un seul groupe dans le conteneur. Si ce n'est pas le cas, vous pouvez faire en sorte que List<RadioButton> dans votre constructeur pour chaque groupe, puis écrivez list.FirstOrDefault(r => r.Checked) .

0 votes

Cela devrait être s.FirstOrDefault au lieu de list.FirstOrDefault dans le deuxième paragraphe de votre réponse ?

0 votes

@Phoenix : s est une pluralisation, pas un nom de variable.

0 votes

Excellente réponse, mais ne répond pas vraiment à la question principale du PO. Voir ma réponse.

42voto

Bobby Points 6894

Vous pouvez câbler le CheckedEvents de tous les boutons contre un seul manipulateur. Vous pourrez ainsi obtenir facilement la bonne case à cocher.

// 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;
    }
}

0 votes

Ce devrait être plutôt ceci - if (((RadioButton)sender).Checked)

1 votes

Il n'y a pas de CheckedChanged dans le RadioButton de WPF ; d'où vient-il ?

27voto

João Angelo Points 24422

Pour ceux qui ne disposent pas de 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;
}

14voto

D'Hag Points 245

L'OP voulait obtenir le bouton radio coché 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 pousser le LINQ un peu plus loin.

Voici un exemple tiré de mon propre code de travail. Conformément à la norme WPF, mes RadioButtons sont contenus dans un fichier Grid (appelée "myGrid") avec un certain nombre d'autres types de contrôles. J'ai deux groupes de boutons radio différents dans la grille.

Pour obtenir le bouton radio coché d'un groupe particulier :

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

Si votre code ne permet pas de vérifier les RadioButtons, utilisez alors SingleOrDefault() (Si je n'utilise pas de boutons à trois états, je définis toujours un bouton "IsChecked" comme sélection par défaut).

1 votes

R.GroupName == "GroupName" et r.IsChecked sont de types différents (bool et bool ?), vous auriez dû utiliser r.IsChecked.Value, qui est de type bool.

1 votes

Essayez .Where(r => r.GroupName == "GroupName" && r.IsChecked == true) parce que r.IsChecked est une propriété bool nullable.

0 votes

À quoi fait référence myGrid ici.

5voto

tanascius Points 22712

Vous pouvez utiliser le CheckedChanged pour tous vos RadioButtons. Sender seront les boutons radio cochés et non cochés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X