TableLayoutPanel 中的单选按钮行为

RadioButton behavior in TableLayoutPanel

我正在使用 TableLayoutPanel 和锚点 属性 来制作一个 window 应用程序,它看起来很好,不受屏幕分辨率或表单大小的影响。 为了设计winform我参考了this article

我的表格上有 3 个 RadioButtons。在没有 TableLayoutPanel 的情况下工作之前,RadioButtons 的行为符合我的预期。选中一个 RadioButton,取消选中另外 2 个。 将每个 RadioButton 添加到 TableLayoutPanel 的不同单元格后,RadioButtons 的行为发生了变化。选中 RadioButton 不会取消选中其他的。

是否有任何 属性(组 属性)可以设置为让 3 RadioButtons 一起工作?

将一个组的所有单选按钮放在容器对象中,例如 PanelGroupBox。这将自动将它们组合在一起。

首先让我说一个好的解决方案的关键是保持属于 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 并稍微扩展签名和代码..