c# - language - tutoriel band in a box en français




Quel bouton radio du groupe est coché? (8)

Utiliser WinForms Y a-t-il une meilleure façon 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 vérifiez un RadioButton différent, alors il sait lequel décocher ... donc il doit savoir qui est coché. Comment puis-je extraire ces informations 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;
     }

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


GroupBox a un événement Validated à cette fin, 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();
     }

Parfois, dans des situations comme celle-ci, ma jeunesse me manque, quand Access était mon poison de prédilection et que je pouvais donner à chaque bouton de radio dans un groupe sa propre valeur.

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

J'ai utilisé de manière proactive un bouton pour capturer la valeur du bouton coché, car l'attribution d'un gestionnaire d'événements à tous les événements CHeckCHanged des boutons entraîne le déclenchement de chaque bouton, car leur modification les modifie tous. La valeur de l'expéditeur est donc toujours la première RadioButton du groupe. Au lieu de cela, j'utilise cette méthode lorsque j'ai besoin de trouver celle qui 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());
    }

FYI, j'ai testé et utilisé cela dans mon travail.

Joey


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

Vous pouvez câbler les CheckedEvents de tous les boutons contre un seul gestionnaire. Là, vous pouvez facilement obtenir 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;
    }
}

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, 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 créer List<RadioButton> dans votre constructeur pour chaque groupe, puis écrire list.FirstOrDefault(r => r.Checked) .


Vous pouvez utiliser une méthode d'extension pour itérer la collection Parent.Controls de RadioButton. Cela vous permet d'interroger d'autres boutons radio dans la même portée. En utilisant deux méthodes d’extension, vous pouvez utiliser la première méthode pour déterminer si des boutons radio du groupe sont sélectionnés, puis utiliser le second pour obtenir la sélection. Le champ Tag RadioButton peut être utilisé pour contenir un Enum pour identifier chaque RadioButton du 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;

si vous voulez enregistrer la sélection pour la classer ou tout 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 l'appelle avec

string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;




radio-button