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;
}
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)
.
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;
}
}
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 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.)
Vous pouvez utiliser l'événement CheckedChanged pour tous vos RadioButtons. {[0] } sera les RadioButtons non cochés et cochés.
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;
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
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;
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
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.
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();
}
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