我正在使用TableLayoutPanel和anchor属性,以使窗口应用程序看起来很好地独立于屏幕分辨率或窗体调整大小。 为了设计winform,我提到this article。
我的表单上有3 RadioButtons
。在没有TableLayoutPanel
的情况下工作之前,RadioButtons
按照我的期望行事。检查一个RadioButton
,取消选中其他2个。
将每个RadioButton
添加到TableLayoutPanel
的不同单元格后,RadioButtons
行为发生了变化。检查RadioButton
不会取消选中其他内容。
是否有任何属性(群组属性)可以让3 RadioButtons
一起工作?
答案 0 :(得分:1)
首先让我说,一个好的解决方案的关键是你保持属于一个组的按钮的视觉范例;用户不要对RadioButtons
进行交互感到惊讶,尽管它们彼此相距很远。但是你的布局似乎可以解决这个问题。
可能由于这个原因,没有任何属性可以允许随机分组RB。
这是一个帮助类,它独立地管理RadioButtons
个容器..:
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); }
}
要使用它,您需要注册要参加虚拟组的每个RadioButton
&#39; ..:
static RadioCtl RbCtl = new RadioCtl();
public Form1()
{
InitializeComponent();
RbCtl.RegisterRB(radioButton1);
RbCtl.RegisterRB(radioButton2);
RbCtl.RegisterRB(radioButton3);
RbCtl.RegisterRB(radioButton4);
RbCtl.RegisterRB(radioButton5);
}
您可以随时取消注册或重新注册任何RadioButton
,也可以在该群组中找到该索引。
另请注意,这仅支持一个组RadioButtons
。如果您需要更多,请使用第二个对象或展开类以允许多个(可能是命名的组)。您可以将List
替换为Dictionary
,然后稍微扩展签名和代码..
答案 1 :(得分:0)
将一个组的所有单选按钮放在容器对象中,例如Panel
或GroupBox
。这将自动将它们组合在一起。