Comment grouper les boutons radio Windows Form?

Comment puis-je regrouper les boutons radio dans l’application Windows Form (un peu comme la liste de contrôle d’ASP.NET!)?

Donc, je peux basculer entre chaque cas choisi parmi les options.

Placez tous les boutons radio d’un groupe dans un object conteneur tel qu’un Panel ou une GroupBox . Cela les regroupera automatiquement dans Windows Forms.

Regardez pour placer vos boutons radio dans un GroupBox .

Vous devez placer tous les boutons radio du groupe dans le même conteneur, par exemple une zone de groupe ou un panneau.

J’aime le concept de regrouper les boutons radio dans WPF. Il existe une propriété GroupName qui spécifie quels contrôles RadioButton sont mutuellement exclusifs ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx ).

J’ai donc écrit une classe dérivée pour WinForms qui prend en charge cette fonctionnalité:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Windows.Forms.VisualStyles; using System.Drawing; using System.ComponentModel; namespace Use.your.own { public class AdvancedRadioButton : CheckBox { public enum Level { Parent, Form }; [Category("AdvancedRadioButton"), Description("Gets or sets the level that specifies which RadioButton controls are affected."), DefaultValue(Level.Parent)] public Level GroupNameLevel { get; set; } [Category("AdvancedRadioButton"), Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")] public ssortingng GroupName { get; set; } protected override void OnCheckedChanged(EventArgs e) { base.OnCheckedChanged(e); if (Checked) { var arbControls = (dynamic)null; switch (GroupNameLevel) { case Level.Parent: if (this.Parent != null) arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton)); break; case Level.Form: Form form = this.FindForm(); if (form != null) arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton)); break; } if (arbControls != null) foreach (Control control in arbControls) if (control != this && (control as AdvancedRadioButton).GroupName == this.GroupName) (control as AdvancedRadioButton).Checked = false; } } protected override void OnClick(EventArgs e) { if (!Checked) base.OnClick(e); } protected override void OnPaint(PaintEventArgs pevent) { CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this); RadioButtonState radioButtonState; if (Checked) { radioButtonState = RadioButtonState.CheckedNormal; if (Focused) radioButtonState = RadioButtonState.CheckedHot; if (!Enabled) radioButtonState = RadioButtonState.CheckedDisabled; } else { radioButtonState = RadioButtonState.UncheckedNormal; if (Focused) radioButtonState = RadioButtonState.UncheckedHot; if (!Enabled) radioButtonState = RadioButtonState.UncheckedDisabled; } Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState); Rectangle rect = pevent.ClipRectangle; rect.Width -= glyphSize.Width; rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top); RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState); } private IEnumerable GetAll(Control control, Type type) { var controls = control.Controls.Cast(); return controls.SelectMany(ctrl => GetAll(ctrl, type)) .Concat(controls) .Where(c => c.GetType() == type); } } } 

Bouton radio sans panneau

 public class RadioButton2 : RadioButton { public ssortingng GroupName { get; set; } } private void RadioButton2_Clicked(object sender, EventArgs e) { RadioButton2 rb = (sender as RadioButton2); if (!rb.Checked) { foreach (var c in Controls) { if (c is RadioButton2 && (c as RadioButton2).GroupName == rb.GroupName) { (c as RadioButton2).Checked = false; } } rb.Checked = true; } } private void Form1_Load(object sender, EventArgs e) { //a group RadioButton2 rb1 = new RadioButton2(); rb1.Text = "radio1"; rb1.AutoSize = true; rb1.AutoCheck = false; rb1.Top = 50; rb1.Left = 50; rb1.GroupName = "a"; rb1.Click += RadioButton2_Clicked; Controls.Add(rb1); RadioButton2 rb2 = new RadioButton2(); rb2.Text = "radio2"; rb2.AutoSize = true; rb2.AutoCheck = false; rb2.Top = 50; rb2.Left = 100; rb2.GroupName = "a"; rb2.Click += RadioButton2_Clicked; Controls.Add(rb2); //b group RadioButton2 rb3 = new RadioButton2(); rb3.Text = "radio3"; rb3.AutoSize = true; rb3.AutoCheck = false; rb3.Top = 80; rb3.Left = 50; rb3.GroupName = "b"; rb3.Click += RadioButton2_Clicked; Controls.Add(rb3); RadioButton2 rb4 = new RadioButton2(); rb4.Text = "radio4"; rb4.AutoSize = true; rb4.AutoCheck = false; rb4.Top = 80; rb4.Left = 100; rb4.GroupName = "b"; rb4.Click += RadioButton2_Clicked; Controls.Add(rb4); } 

Mettre des boutons radio dans GroupBox (ou un autre panneau)

entrer la description de l'image ici

GroupBox est mieux.Mais non seulement la boîte de groupe, même vous pouvez utiliser des Panels ( System.Windows.Forms.Panel ).

  • C’est très utile lorsque vous concevez la boîte de dialog de configuration d’Internet Protocol version 4. (Vérifiez-la avec votre PC (Windows), puis vous pouvez comprendre le comportement)

Si vous ne pouvez pas les placer dans un conteneur, vous devez écrire du code pour modifier l’état vérifié de chaque RadioButton :

 private void rbDataSourceFile_CheckedChanged(object sender, EventArgs e) { rbDataSourceNet.Checked = !rbDataSourceFile.Checked; } private void rbDataSourceNet_CheckedChanged(object sender, EventArgs e) { rbDataSourceFile.Checked = !rbDataSourceNet.Checked; } 

Tous les boutons radio à l’intérieur d’un conteneur de partage sont dans le même groupe par défaut . Moyens, si vous vérifiez l’un d’eux – les autres seront décochés. Si vous souhaitez créer des groupes indépendants de boutons radio, vous devez les placer dans différents conteneurs, tels que Group Box , ou contrôler leur état Checked grâce à du code derrière .