我正在使用TableLayoutPanel和anchor属性,以使窗口应用程序的外观与屏幕分辨率或窗体调整大小无关。
为了设计Winform,我提到了this article。
我的表格上有3个RadioButtons
。在没有TableLayoutPanel
的情况下工作之前,RadioButtons
的行为符合我的期望。选中一个RadioButton
,不选中其他两个。
将每个RadioButton
添加到TableLayoutPanel
的不同单元格后,RadioButtons
行为发生了变化。选中RadioButton
不会取消选中其他CC。
是否可以将3个RadioButtons
设置为任何属性(组属性)?
最佳答案
首先,我要说一个好的解决方案的关键是要保持属于一组的按钮的视觉范式。尽管它们彼此相距很远,但RadioButtons
交互不会使用户感到惊讶。但是,您的布局似乎可以解决这一问题。
可能正是由于这个原因,没有属性允许将RB随机分组。
这是一个帮助程序类,该类独立地管理其容器.cc:
class RadioCtl
{
private List<RadioButton> buttons { get; set; }
private bool auto = false;
public RadioCtl() { buttons = new List<RadioButton>(); }
public int RegisterRB(RadioButton rb)
{
if (!buttons.Contains(rb))
{
buttons.Add(rb);
rb.CheckedChanged += rb_CheckedChanged;
}
return buttons.IndexOf(rb);
}
void rb_CheckedChanged(object sender, EventArgs e)
{
RadioButton rbClicked = sender as RadioButton;
if (rbClicked == null || auto) return;
auto = true;
foreach (RadioButton rb in buttons)
{
if ((rb != rbClicked) && (rb.Parent != rbClicked.Parent) )
rb.Checked = false;
}
auto = false;
}
public void UnregisterRB(RadioButton rb)
{
if (buttons.Contains(rb))
{
buttons.Remove(rb);
rb.CheckedChanged -= rb_CheckedChanged;
}
}
public void Clear() { foreach(RadioButton rb in buttons) UnregisterRB(rb); }
public int IndexOfRB(RadioButton rb) { return buttons.IndexOf(rb); }
}
要使用它,您需要注册要加入“虚拟组”的每个
RadioButtons
。.:static RadioCtl RbCtl = new RadioCtl();
public Form1()
{
InitializeComponent();
RbCtl.RegisterRB(radioButton1);
RbCtl.RegisterRB(radioButton2);
RbCtl.RegisterRB(radioButton3);
RbCtl.RegisterRB(radioButton4);
RbCtl.RegisterRB(radioButton5);
}
您可以随时注销或重新注册任何
RadioButton
或在组中找到索引。另请注意,这仅支持一组
RadioButton
。如果需要更多,请使用第二个对象或扩展类以允许多个(可能是命名的)组。为此,您可以将RadioButtons
替换为List
,并稍微扩展签名和代码。关于c# - TableLayoutPanel中的RadioButton行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37675837/