TableLayoutPanel

时间:2016-06-07 09:44:24

标签: c# winforms layout radio-button tablelayoutpanel

我正在使用TableLayoutPanel和anchor属性,以使窗口应用程序看起来很好地独立于屏幕分辨率或窗体调整大小。 为了设计winform,我提到this article

我的表单上有3 RadioButtons。在没有TableLayoutPanel的情况下工作之前,RadioButtons按照我的期望行事。检查一个RadioButton,取消选中其他2个。 将每个RadioButton添加到TableLayoutPanel的不同单元格后,RadioButtons行为发生了变化。检查RadioButton不会取消选中其他内容。

enter image description here

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

2 个答案:

答案 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)

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