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.
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.
Đặ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.
@mohammadsadeghsaati Câu hỏi là về Windows Forms RadioButton, nó không trưng ra một thuộc tính GroupName. – UweB
@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 đó? –
@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 –
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.
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ọ. –
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
).
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);
}
}
}
Đ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
Xin cảm ơn!Mã này hoạt động và nó đã giúp ích trong trường hợp của tôi –
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? –
Đà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);
}
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;
}
Bạn có thể có một cái nhìn tại [Windows Forms RadioButtonList] (https://stackoverflow.com/a/41355419/3110834) –