2010-02-01 15 views
255

¿Cómo puedo agrupar los botones de opción en la aplicación Windows Form (muy parecido a la lista de botones de radio de ASP.NET)?¿Cómo puedo agrupar los botones de radio de Windows Form?

Así que puedo cambiar entre cada caso elegido entre las opciones.

+0

Puede echar un vistazo a las formas de Windows [RadioButtonList] (https://stackoverflow.com/a/41355419/3110834) –

Respuesta

339

Coloque todos los botones de opción para un grupo en un objeto contenedor como Panel o GroupBox. Eso los agrupará automáticamente en Windows Forms.

+13

@mohammadsadeghsaati La pregunta era sobre Windows Forms RadioButton, no expone una propiedad GroupName. – UweB

+2

@UweB ¿Qué pasa si no puedo agregar cuadros de grupo y paneles debido a algún problema? Digamos que no tengo mucho espacio en mi formulario. ¿Entonces? –

+2

@MuhammadSaqib es imposible porque los paneles pueden ser de tamaño cero. Me refiero a los paneles con bordes invisibles y sin márgenes son los mismos que la forma simple. Solo use el panel derecho - TableLayoutPanel si debe agrupar en la tabla, etc. –

38

Mira colocando tus botones de radio en GroupBox.

+0

GroupBox no tiene ninguna relación con los botones de opción. Cualquier contenedor servirá. – usr

30

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

+0

Se complica cuando tienes capas de paneles anidados, como cuando intentas hacer [algo que se ve así] (http://thewindowsclub.thewindowsclubco.netdna-cdn.com/wp-content/uploads/ 2012/03/syskey-2.jpg). Los botones de radio entran en conflicto con sus padres. –

4

GroupBox es mejor.Pero no solo el cuadro de grupo, incluso usted puede usar Panels (System.Windows.Forms.Panel).

  • que es muy útil cuando se está diseñando Protocolo de Internet versión 4 diálogo de ajuste. (Marque con su ordenador (Windows), entonces se puede entender el comportamiento)
21

me gusta el concepto de agrupación RadioButtons en WPF. Existe una propiedad GroupName que especifica qué controles de RadioButton son mutuamente excluyentes (http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx).

Así que escribí una clase derivada de WinForms que admita esta característica:

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

Esto fue muy útil para mí en una situación en la que necesitaba RadioButtons en un grupo dentro de TableLayoutPanel - ¡gracias! – pelazem

+0

¡Gracias!Este código funciona y me ayudó en mi caso –

+0

Estoy tratando de usar esta clase para uno de mis propios formularios, pero tengo problemas para lograr que el control se muestre encima de un cuadro de grupo (como si fuera el título del cuadro de grupo). Está destinado a servir como el botón de opción de nivel superior (* id est *, el grupo para este botón de opción 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? –

10

botón de radio sin panel de

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

Si no se les puede poner en un recipiente, entonces usted tiene que escribir código para cambiar comprueba el estado 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; 
} 
4

botones de radio coloca dentro GroupBox (u otro panel)

enter image description here

Cuestiones relacionadas