2010-02-01 44 views
255

Làm cách nào để nhóm các nút radio trong ứng dụng Windows Form (rất giống với danh sách radiobutton của ASP.NET!)?Làm cách nào để nhóm các nút radio Windows Form?

Vì vậy, tôi có thể chuyển đổi giữa từng trường hợp được chọn từ các tùy chọn.

+0

Bạn có thể có một cái nhìn tại [Windows Forms RadioButtonList] (https://stackoverflow.com/a/41355419/3110834) –

Trả lời

339

Đặt tất cả các nút radio cho một nhóm trong đối tượng vùng chứa như Panel hoặc GroupBox. Điều đó sẽ tự động nhóm chúng lại với nhau trong Windows Forms.

+13

@mohammadsadeghsaati Câu hỏi là về Windows Forms RadioButton, nó không trưng ra một thuộc tính GroupName. – UweB

+2

@UweB điều gì xảy ra nếu tôi không thể thêm các hộp và bảng nhóm do bất kỳ sự cố nào, giả sử tôi không có nhiều không gian trên biểu mẫu của tôi. Sau đó? –

+2

@MuhammadSaqib nó là không thể vì các tấm có thể bằng không. Tôi có nghĩa là các tấm với đường viền vô hình và không có lề là giống như hình thức đơn giản. Chỉ cần sử dụng bảng bên phải - TableLayoutPanel nếu bạn nên nhóm trong bảng vv –

38

Xem cách đặt các nút radio của bạn trong một GroupBox.

+0

GroupBox hoàn toàn không liên quan đến các nút radio. Bất kỳ thùng chứa nào cũng sẽ làm. – usr

30

Bạn nên đặt tất cả các nút radio của nhóm bên trong cùng một vùng chứa như GroupBox hoặc Bảng điều khiển.

+0

Sẽ phức tạp khi bạn có các lớp bảng lồng nhau, chẳng hạn như khi bạn đang cố gắng làm [cái gì đó trông như thế này] (http://thewindowsclub.thewindowsclubco.netdna-cdn.com/wp-content/uploads/ 2012/03/syskey-2.jpg). Các nút radio xung đột với cha mẹ của họ. –

4

GroupBox là tốt hơn. Nhưng không chỉ hộp nhóm, thậm chí bạn có thể sử dụng Panels (System.Windows.Forms.Panel).

  • Đó là rất hữu ích khi bạn đang thiết kế phiên bản Internet Protocol 4 hộp thoại thiết lập. (Kiểm tra nó với máy tính của bạn (cửa sổ), sau đó bạn có thể hiểu được hành vi)
21

Tôi thích các khái niệm về nhóm RadioButtons trong WPF. Có một thuộc tính GroupName chỉ định điều khiển RadioButton nào loại trừ lẫn nhau (http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx).

Vì vậy, tôi đã viết một lớp được thừa kế cho WinForms có hỗ trợ tính năng này:

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

Điều này có ích cho tôi trong một tình huống mà tôi cần RadioButton trong một nhóm bên trong TableLayoutPanel - cảm ơn bạn! – pelazem

+0

Xin cảm ơn!Mã này hoạt động và nó đã giúp ích trong trường hợp của tôi –

+0

Tôi đang cố gắng sử dụng lớp này cho một trong các biểu mẫu của riêng tôi, nhưng gặp khó khăn khi điều khiển hiển thị trên đầu một hộp nhóm (như thể đó là tiêu đề của hộp nhóm). Nó có nghĩa là để phục vụ như là nút radio cấp cao nhất (* id est *, nhóm cho nút radio này là một bảng điều khiển ở gốc của biểu mẫu và hộp nhóm là anh chị em). Có bất kỳ mã ví dụ nào về cách sử dụng lớp này để đạt được điều đó không? –

10
nút

Đài phát thanh mà không cần bảng

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

Nếu bạn không thể đặt chúng vào một container, sau đó bạn phải viết mã để thay đổi kiểm tra trạng thái của mỗi 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

nút Đặt đài phát thanh bên trong GroupBox (hoặc bảng khác)

enter image description here

Các vấn đề liên quan