Utiliser WinForms; Existe-t-il un meilleur moyen de rechercher le bouton RadioButton coché pour un groupe? Il me semble que le code ci-dessous ne devrait pas être nécessaire. Lorsque vous cochez un bouton RadioButton différent, il sait lequel décocher… il doit donc savoir lequel est coché. Comment puis-je tirer cette information sans faire beaucoup de déclarations 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;
}
Vous pouvez utiliser LINQ:
var checkedButton = container.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked);
Notez que cela nécessite que tous les boutons d'option soient directement dans le même conteneur (par exemple, Panel ou Form) et qu'il n'y ait qu'un groupe dans le conteneur. Si ce n'est pas le cas, vous pouvez créer List<RadioButton>
s dans votre constructeur pour chaque groupe, puis écrire list.FirstOrDefault(r => r.Checked)
.
Vous pouvez connecter les CheckedEvents de tous les boutons à un seul 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;
}
}
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;
}
L'OP souhaitait obtenir le contrôle RadioButton PAR GROUPE. Bien que la réponse de @SLaks soit excellente, elle ne répond pas vraiment à la question principale du PO. Pour améliorer la réponse de @SLaks, il suffit d'aller un peu plus loin dans LINQ.
Voici un exemple de mon propre code de travail. Par WPF normal, mes boutons radio sont contenus dans une grille (nommée "myGrid") avec un tas d'autres types de contrôles. J'ai deux groupes RadioButton différents dans la grille.
Pour obtenir le contrôle RadioButton vérifié d'un groupe particulier:
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 RadioButton ne soit vérifié, utilisez "SingleOrDefault ()". (Si je n'utilise pas de boutons à trois états, je configure toujours un bouton "IsChecked" comme sélection par défaut.)
Vous pouvez utiliser l'événement CheckedChanged pour tous vos boutons RadioButtons. Sender
seront les boutons radio désactivés et cochés.
En plus du câblage CheckedChangedEvent, vous pouvez utiliser la propriété Controls "Tag" pour distinguer les boutons radio ... une alternative (code spaghetti) serait la propriété "TabIndex"; P
Parfois, dans des situations comme celle-ci, ma jeunesse me manque, quand Access était mon poison de prédilection et que je pouvais attribuer à chaque bouton radio du 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 du radiobutton sélectionné. Dans cet exemple, directionGroup est le groupe dans lequel j'ai quatre boutons radio cinq avec "None" 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 à l'événement CHeckCHanged de tous les boutons provoque le déclenchement de CHAQUE bouton, car sa modification en modifie tous les effets. Ainsi, la valeur de l'expéditeur est toujours le premier RadioButton du groupe. Au lieu de cela, j'utilise cette méthode lorsque 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 votre information, j'ai testé et utilisé cela dans mon travail.
Joey
Vous pouvez utiliser une méthode Extension pour itérer la collection Parent.Controls de RadioButton. Cela vous permet d’interroger d’autres RadioButtons dans le même périmètre. En utilisant deux méthodes d’extension, vous pouvez utiliser la première pour déterminer si des radio-boutons du groupe sont sélectionnés, puis utiliser la seconde pour obtenir la sélection. Le champ Tag RadioButton peut être utilisé pour contenir un Enum afin d'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 souhaitez 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 très 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 retourne -1.
Mise à jour: Il s'est avéré que ma première tentative ne fonctionnait pas s'il n'y avait 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 maintenant fonctionner.
si vous voulez enregistrer la sélection dans un fichier ou dans un autre fichier 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;
La 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();
}
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