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.


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 .


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


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

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


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)

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 .


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

Cela vous mettra dans une boucle infinie ,,,
Michael Sandler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.