¿Cómo agrupo los botones de opción de Windows Form?

Respuestas:

425

Ponga todos los botones de radio para un grupo en un objeto contenedor como a Panelo a GroupBox. Eso los agrupará automáticamente en formularios Windows Forms.

Steve Danner
fuente
13
@mohammadsadeghsaati La pregunta era sobre RadioButton de formularios Windows Forms, no expone una propiedad GroupName.
UweB
2
@UweB, ¿qué pasa si no puedo agregar cuadros y paneles de grupo debido a algún problema? Digamos que no tengo mucho espacio en mi formulario. ¿Luego?
Muhammad Saqib
2
@MuhammadSaqib es imposible porque los paneles pueden ser de tamaño cero. Me refiero a paneles con bordes invisibles y sin márgenes son lo mismo que la forma simple. Simplemente use el panel derecho - TableLayoutPanel si debe agrupar en la tabla, etc.
Alex Zhukovskiy
38

Mira colocar tus botones de radio en un GroupBox .

AJ
fuente
1
GroupBox no tiene ninguna relación con los botones de radio. Cualquier contenedor servirá.
usr
30

Debe colocar todos los botones de radio del grupo dentro del mismo contenedor, como un GroupBox o Panel.

Nikos Steiakakis
fuente
1
Se complica cuando tienes capas de paneles anidados, como cuando intentas hacer algo como esto . Los botones de radio entran en conflicto con sus padres.
Agi Hammerthief
24

Me gusta el concepto de agrupar RadioButtons en WPF. Hay una propiedad GroupNameque especifica qué controles RadioButton son mutuamente excluyentes ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx ).

Entonces escribí una clase derivada para WinForms que admite esta función:

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
fuente
3
Esto fue útil para mí en una situación en la que necesitaba RadioButtons en un grupo dentro de un TableLayoutPanel. ¡Gracias!
pelazem
Estoy tratando de usar esta clase para uno de mis propios formularios, pero tengo problemas para que el control se muestre en la parte superior de un cuadro de grupo (como si fuera el título del cuadro de grupo). Está destinado a servir como botón de radio de nivel superior ( id est , el grupo para este botón de radio es un panel en la raíz del formulario y el cuadro de grupo es un hermano). ¿Hay algún código de ejemplo sobre cómo usar esta clase para lograr eso?
Agi Hammerthief
Escribiría en IEnumerable<Control> arbControls = null;lugar de usar dinámico. Lo varenmascara aún más, y es por eso que normalmente uso solo tipos explícitos en mi código. De lo contrario, muy buen trabajo, ¡y muchas gracias por compartir esto! +1
sɐunıɔ ןɐ qɐp
11

Botón de radio sin panel

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
fuente
7

Ponga botones de radio dentro de GroupBox (u otro panel)

ingrese la descripción de la imagen aquí

Luis perez
fuente
5

GroupBoxes mejor Pero no solo el cuadro de grupo, incluso puedes usar Panels( System.Windows.Forms.Panel).

  • Eso es muy útil cuando diseña el diálogo de configuración del Protocolo de Internet versión 4. (Verifíquelo con su PC (Windows), entonces puede comprender el comportamiento)
Elshan
fuente
5

Todos los botones de radio dentro de un contenedor compartido están en el mismo grupo de manera predeterminada . Significa, si marca uno de ellos, otros serán desmarcados. Si desea crear grupos independientes de botones de opción, debe ubicarlos en diferentes contenedores como Group Box, o controlar su estado Comprobado a través del código que se encuentra detrás .

Mr.B
fuente
4

Si no puede colocarlos en un contenedor, debe escribir un código para cambiar el estado verificado de cada 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;
}
grasa
fuente
Esto te pondrá en un ciclo infinito ,,,
Michael Sandler