Comment regrouper les boutons radio Windows Form?

Réponses:

425

Placez tous les boutons radio d'un groupe dans un objet conteneur comme a Panelou a GroupBox. Cela les regroupera automatiquement dans Windows Forms.

Steve Danner
la source
13
@mohammadsadeghsaati La question concernait le RadioButton Windows Forms, il n'expose pas une propriété GroupName.
UweB
2
@UweB si je ne peux pas ajouter de zones de groupe et de panneaux en raison d'un problème, disons que je n'ai pas beaucoup d'espace sur mon formulaire. Ensuite?
Muhammad Saqib
2
@MuhammadSaqib c'est impossible car les panneaux peuvent être de taille nulle. Je veux dire que les panneaux avec des bordures invisibles et sans marges sont identiques à la forme simple. Utilisez simplement le panneau de droite - TableLayoutPanel si vous devez regrouper dans le tableau, etc.
Alex Zhukovskiy
38

Regardez comment placer vos boutons radio dans une GroupBox .

UN J.
la source
1
GroupBox est totalement indépendant des boutons radio. N'importe quel conteneur fera l'affaire.
usr
30

Vous devez placer tous les boutons radio du groupe à l'intérieur du même conteneur tel qu'un GroupBox ou un Panel.

Nikos Steiakakis
la source
1
Cela se complique lorsque vous avez des couches de panneaux imbriqués, par exemple lorsque vous essayez de faire quelque chose qui ressemble à ceci . Les boutons radio sont en conflit avec leurs parents.
Agi Hammerthief
24

J'aime le concept de regroupement des RadioButtons dans WPF. Il existe une propriété GroupNamequi spécifie quels contrôles RadioButton s'excluent mutuellement ( 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 string 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<Control> GetAll(Control control, Type type)
        {
            var controls = control.Controls.Cast<Control>();

            return controls.SelectMany(ctrl => GetAll(ctrl, type))
                                      .Concat(controls)
                                      .Where(c => c.GetType() == type);
        }
    }
}
pr0gg3r
la source
3
Cela m'a été utile dans une situation où j'avais besoin de RadioButtons dans un groupe à l'intérieur d'un TableLayoutPanel - merci!
pelazem
J'essaie d'utiliser cette classe pour l'un de mes propres formulaires, mais j'ai du mal à afficher le contrôle au-dessus d'une zone de groupe (comme si c'était le titre de la zone de groupe). Il est destiné à servir de bouton radio de niveau supérieur ( id est , le groupe de ce bouton radio est un panneau à la racine du formulaire et la zone de groupe est un frère). Existe-t-il un exemple de code sur la façon d'utiliser cette classe pour y parvenir?
Agi Hammerthief
J'écrirais IEnumerable<Control> arbControls = null;au lieu d'utiliser dynamique. Le varmasque encore plus, et c'est pourquoi j'utilise normalement uniquement des types explicites dans mon code. Sinon, très bon travail, et merci beaucoup pour le partage! +1
sɐunıɔ ןɐ qɐp
11

Bouton radio sans panneau

public class RadioButton2 : RadioButton
{
   public string 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);
}
Suat Erenler
la source
7

Placer des boutons radio dans GroupBox (ou autre panneau)

entrez la description de l'image ici

Luis Perez
la source
5

GroupBoxest mieux, mais pas seulement la zone de groupe, même vous pouvez utiliser Panels( System.Windows.Forms.Panel).

  • C'est très utile lorsque vous concevez la boîte de dialogue de configuration du protocole Internet version 4. (Vérifiez-la avec votre PC (Windows), vous comprendrez alors le comportement)
Elshan
la source
5

Tous les boutons radio à l'intérieur d'un conteneur de partage sont dans le même groupe par défaut . Signifie, si vous cochez l'un d'eux - les autres seront décochés. Si vous souhaitez créer des groupes de boutons radio indépendants, vous devez les placer dans différents conteneurs tels que Group Box, ou contrôler leur état Vérifié via le code derrière .

Mr.B
la source
4

Si vous ne pouvez pas les mettre dans un conteneur, vous devez alors écrire du code pour changer 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;
}
graisse
la source
Cela vous mettra dans une boucle infinie ,,,
Michael Sandler