TableLayoutPanel 中的单选按钮行为
RadioButton behavior in TableLayoutPanel
我正在使用 TableLayoutPanel 和锚点 属性 来制作一个 window 应用程序,它看起来很好,不受屏幕分辨率或表单大小的影响。
为了设计winform我参考了this article
我的表格上有 3 个 RadioButtons
。在没有 TableLayoutPanel
的情况下工作之前,RadioButtons
的行为符合我的预期。选中一个 RadioButton
,取消选中另外 2 个。
将每个 RadioButton
添加到 TableLayoutPanel
的不同单元格后,RadioButtons
的行为发生了变化。选中 RadioButton
不会取消选中其他的。
是否有任何 属性(组 属性)可以设置为让 3 RadioButtons
一起工作?
将一个组的所有单选按钮放在容器对象中,例如 Panel
或 GroupBox
。这将自动将它们组合在一起。
首先让我说一个好的解决方案的关键是保持属于 one 组的按钮的视觉范例;用户一定不会对 RadioButtons
的交互感到惊讶,尽管它们彼此相距很远。但是您的布局似乎可以很好地解决这个问题。
可能正是因为这个原因,没有 属性 允许随机分组 RB..
这是一个助手 class,它管理 RadioButtons
独立于它们的容器..:[=19=]
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
您想要参加 'virtual group'..:[=19=]
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
。如果您需要更多,请使用第二个对象或扩展 class 以允许多个可能命名的组。为此,您可以将 List
替换为 Dictionary
并稍微扩展签名和代码..
我正在使用 TableLayoutPanel 和锚点 属性 来制作一个 window 应用程序,它看起来很好,不受屏幕分辨率或表单大小的影响。 为了设计winform我参考了this article
我的表格上有 3 个 RadioButtons
。在没有 TableLayoutPanel
的情况下工作之前,RadioButtons
的行为符合我的预期。选中一个 RadioButton
,取消选中另外 2 个。
将每个 RadioButton
添加到 TableLayoutPanel
的不同单元格后,RadioButtons
的行为发生了变化。选中 RadioButton
不会取消选中其他的。
是否有任何 属性(组 属性)可以设置为让 3 RadioButtons
一起工作?
将一个组的所有单选按钮放在容器对象中,例如 Panel
或 GroupBox
。这将自动将它们组合在一起。
首先让我说一个好的解决方案的关键是保持属于 one 组的按钮的视觉范例;用户一定不会对 RadioButtons
的交互感到惊讶,尽管它们彼此相距很远。但是您的布局似乎可以很好地解决这个问题。
可能正是因为这个原因,没有 属性 允许随机分组 RB..
这是一个助手 class,它管理 RadioButtons
独立于它们的容器..:[=19=]
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
您想要参加 'virtual group'..:[=19=]
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
。如果您需要更多,请使用第二个对象或扩展 class 以允许多个可能命名的组。为此,您可以将 List
替换为 Dictionary
并稍微扩展签名和代码..