2010-10-03 14 views
15

Załadowałem 4 przyciski radia i po uruchomieniu programu kliknę je, a kliknę jedno kliknięcie, a pozostałe znikną. Co, jeśli chciałem mieć dwa przyciski radiowe, ale robili różne rzeczy?Przyciski radia WinForms

Odpowiedz

21

Grupuj różne zestawy opcji w oddzielnych polach grup (lub panelach lub innych kontrolkach kontenera, ale prawdopodobnie są to pola grupowe).

MSDN:

Windows Forms kontrole RadioButton są zaprojektowane, aby dać użytkownikom możliwość wyboru między dwoma lub więcej ustawień, z których tylko jeden może być przyporządkowany do zabiegu lub obiektu. Na przykład grupa kontrolek RadioButton może wyświetlać wybór nośników paczek dla zamówienia, ale tylko jeden z nośników będzie używany. Dlatego można wybrać tylko jeden przycisk RadioButton, nawet jeśli jest on częścią grupy funkcyjnej.

Grupujesz przyciski radiowe, przeciągając je do kontenera, takiego jak kontrolka Panel, kontrolka GroupBox lub formularz.

Zakłada to, że masz cztery lub więcej przycisków opcji w formularzu. Jeśli masz tylko dwa, powiedzmy, i chcesz umożliwić użytkownikowi możliwość wyboru obu, użyj zestawu pól wyboru.

2

spróbować umieścić podobne opcje w pojemniku, jak groupbox

2

Zazwyczaj grupa przycisków radiowych stosuje się, gdy stosuje się tylko jedna opcja. Jeśli jest to prawidłowe, aby wybrać wiele opcji jednocześnie, użyj zamiast tego Checkboxes.

14

Powinieneś używać kontroli GroupBox.
Wszystkie przyciski opcji w GroupBox wzajemnie się wykluczają - umieść 2 przyciski opcji w jednym bloku GroupBox, a 2 w innym bloku GroupBox.
Jeśli nie podoba ci się, aby twój pojemnik był widoczny - użyj panelu sterowania zamiast GroupBox. (Wystarczy przeciągnąć i upuścić)

alt text

Jak można się domyślić, górna jest groupbox, dolna (co jest invisble, ale pozwala tylko jeden readioButton w nim do wyboru) jest płyta.

HTH.

2

Podoba mi się koncepcja grupowania przycisków RadioButton w WPF. Istnieje właściwość GroupName określająca, które kontrolki RadioButton wzajemnie się wykluczają (http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx).

Więc napisałem klasę pochodzącą dla WinForms, który obsługuje tę funkcję:

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

umieścić wszystkie przyciski radiowe w polu grupy.

Teraz we wszystkich przyciskach opcji Właściwości ustaw Auto Check na false.

Alternatywnie, można ustawić

radioButton1->AutoCheck = false; 

Wewnątrz funkcji radioButton1_Click, uchwyt, jak potrzeba.Przykład:

Void radioButton1_Click(Object^ sender, EventArgs^ e) { 
       radioButton1->Enabled = true; 
       radioButton2->Enabled = true; 
       radioButton3->Enabled = true; 
       radioButton1->Checked = true; 
       radioButton2->Checked = true; 
       radioButton3->Checked = true; 
} 

Powoduje zaznaczenie wybranych przycisków radiowych.