Làm cách nào tôi có thể nhóm các nút radio trong ứng dụng Windows Form (rất giống với danh sách phát thanh của ASP.NET!)?
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.
Làm cách nào tôi có thể nhóm các nút radio trong ứng dụng Windows Form (rất giống với danh sách phát thanh của ASP.NET!)?
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.
Câu trả lời:
Đặt tất cả các nút radio cho một nhóm trong một đối tượng chứa như a Panel
hoặc a GroupBox
. Điều đó sẽ tự động nhóm chúng lại với nhau trong Windows Forms.
Bạn nên đặt tất cả các nút radio của nhóm trong cùng một thùng chứa như GroupBox hoặc Bảng điều khiển.
Tôi thích khái niệm nhóm RadioButtons trong WPF. Có một thuộc tính GroupName
chỉ định các điều khiển RadioButton nào loại trừ lẫn nhau ( http://msdn.microsoft.com/de-de/l Library / system.windows.controls.radiobutton.aspx ).
Vì vậy, tôi đã viết một lớp dẫn xuất cho WinForms 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);
}
}
}
IEnumerable<Control> arbControls = null;
thay vì sử dụng năng động. Các var
mặt nạ nó thậm chí nhiều hơn, và đó là lý do tại sao tôi thường chỉ sử dụng loại rõ ràng trong mã của tôi. Nếu không, công việc rất tốt, và cảm ơn rất nhiều vì đã chia sẻ điều này! +1
Nút radio không có bảng điều khiển
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);
}
Tất cả các nút radio bên trong một container cổ phiếu đang ở trong cùng một nhóm theo mặc định . Có nghĩa là, nếu bạn kiểm tra một trong số chúng - những người khác sẽ bị bỏ chọn. Nếu bạn muốn tạo các nhóm nút radio độc lập, bạn phải đặt chúng vào các thùng chứa khác nhau Group Box
, hoặc kiểm soát trạng thái Đã kiểm tra của chúng thông qua mã phía sau .
Nếu bạn không thể đặt chúng vào một thùng chứa, thì bạn phải viết mã để thay đổi trạng thái đã kiểm tra của từng 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;
}