C#:如何避免多个选中的单选按钮

时间:2018-06-26 13:12:32

标签: c# winforms radio-button tablelayoutpanel

在通常情况下,面板中一次只能检查一个RadioButton。

现在我有一个Panel(主要用于实现垂直滚动),其中包含一个两列的TableLayoutPanel。通过单击“添加行”按钮,可以将新行无限地添加到TLP(这就是为什么我需要面板向下滚动)。

TLP中的每一行看起来都一样:

第一列包含具有一个列和两行的另一个TLP。第一行仅包含一个RadioButton,第二行仅包含另一个按钮。

第二列包含一个CheckedListBox。

所以,我们在TLP中添加了5行。所以我有5个RadioButtons。不知道为什么,但是可以一次检查RadioButtons。我该如何避免呢?

以下是将行添加到TLP中的代码:

    void add_newbox()
    {
        var new_chklistbox = new CheckedListBox{
            Dock=DockStyle.Fill,
            Margin=new Padding(0,0,0,3),
            Location=new Point(20,0),
            Size=new Size(238,94),
            HorizontalScrollbar=true,
            CheckOnClick=true
        };

        var new_radiobutton = new RadioButton{
            Text="",
            Dock=DockStyle.Fill,
            Location=new Point(3,3),
            Size=new Size(14,90),
            MaximumSize=new Size(0,90)
        };
        new_radiobutton.Click += (sender, e) => this.focus=new_chklistbox;

        var new_rembutton = new Button{
            Text="-",
            Dock=DockStyle.Fill,
            AutoSize=true,
            AutoSizeMode=AutoSizeMode.GrowAndShrink,
            Margin=new Padding(0)
        };
        new_rembutton.Click += (sender, e) => rem_items();

        var new_tbl = new TableLayoutPanel{
            RowCount=2,
            ColumnCount=1,
            Dock=DockStyle.Fill,
            Margin=new Padding(0)
        };
        new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
        new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));

        new_tbl.Controls.Add(new_radiobutton,0,0);
        new_tbl.Controls.Add(new_rembutton,0,1);

        tbl_groups.Controls.Add(new_tbl,0,tbl_groups.RowCount);
        tbl_groups.Controls.Add(new_chklistbox,1,tbl_groups.RowCount);
}

问候,希拉

5 个答案:

答案 0 :(得分:0)

使用单选按钮的GroupName属性。

答案 1 :(得分:0)

尝试一下。它可能对您有用。

void add_newbox()
{
    var new_chklistbox = new CheckedListBox{
        Dock=DockStyle.Fill,
        Margin=new Padding(0,0,0,3),
        Location=new Point(20,0),
        Size=new Size(238,94),
        HorizontalScrollbar=true,
        CheckOnClick=true
    };

    var new_radiobutton = new RadioButton{
        Text="",
        Dock=DockStyle.Fill,
        Location=new Point(3,3),
        Size=new Size(14,90),
        MaximumSize=new Size(0,90)
    };
    //new_radiobutton.Click += (sender, e) => this.focus=new_chklistbox;

    var new_rembutton = new Button{
        Text="-",
        Dock=DockStyle.Fill,
        AutoSize=true,
        AutoSizeMode=AutoSizeMode.GrowAndShrink,
        Margin=new Padding(0)
    };
    //new_rembutton.Click += (sender, e) => rem_items();

    var new_tbl = new TableLayoutPanel{
        RowCount=2,
        ColumnCount=1,
        Dock=DockStyle.Fill,
        Margin=new Padding(0)
    };
    var new_panel = new Panel
    {
        Dock = DockStyle.Fill,
        AutoSize = true,
        Margin = new Padding(0)
    };
    new_panel.Controls.Add(new_radiobutton);
    new_panel.Controls.Add(new_rembutton);
    new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
    new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));

    new_tbl.Controls.Add(new_panel, 0, 0);

答案 2 :(得分:0)

要使某些单选按钮作为一个组,应将它们全部托管在同一容器中。不同的表布局面板是不同的容器。它描述了行为。

如果出于任何原因想要保持原样,则需要将这些单选按钮的AutoCheck属性设置为true并处理其中的Click事件,以检查刚刚单击的按钮并取消选中其余按钮其中。

示例

private void Form1_Load(object sender, EventArgs e)
{
    var radios = GetChildren(tableLayoutPanel1).OfType<RadioButton>();
    foreach (var radio in radios)
    {
        radio.AutoCheck=false;
        radio.Click += (obj, arg) =>
        {
            radio.Checked = true;
            foreach(var r in radios)
                if (r != radio)
                    r.Checked = false;
        };
    }
}

IEnumerable<Control> GetChildren(Control control)
{
    foreach (Control c1 in control.Controls)
    {
        yield return c1;
        foreach (Control c2 in GetChildren(c1))
            yield return c2;
    }
}

答案 3 :(得分:0)

我对您的代码进行了一些更改,并注释了旧代码。请尝试一下。在这段代码中,我将在现有的TPL控件中添加新行,而不是每次都添加新的TLP。

    void add_newbox()
    {
        var new_chklistbox = new CheckedListBox
        {
            Dock = DockStyle.Fill,
            Margin = new Padding(0, 0, 0, 3),
            Location = new Point(20, 0),
            Size = new Size(238, 94),
            HorizontalScrollbar = true,
            CheckOnClick = true
        };

        var new_radiobutton = new RadioButton
        {
            Text = "",
            Dock = DockStyle.Fill,
            Location = new Point(3, 3),
            Size = new Size(14, 90),
            MaximumSize = new Size(0, 90)
        };
        new_radiobutton.Click += (sender, e) => this.focus = new_chklistbox;

        var new_rembutton = new Button
        {
            Text = "-",
            Dock = DockStyle.Fill,
            AutoSize = true,
            AutoSizeMode = AutoSizeMode.GrowAndShrink,
            Margin = new Padding(0)
        };
        new_rembutton.Click += (sender, e) => rem_items();

        //var new_tbl = new TableLayoutPanel
        //{
        //    RowCount = 2,
        //    ColumnCount = 1,
        //    Dock = DockStyle.Fill,
        //    Margin = new Padding(0)
        //};
        //new_tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
        //new_tbl.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        //new_tbl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));

        //new_tbl.Controls.Add(new_radiobutton, 0, 0);
        //new_tbl.Controls.Add(new_rembutton, 0, 1);

        tbl_groups.RowCount = tbl_groups.RowCount + 1;
        tbl_groups.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        tbl_groups.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));

        tbl_groups.Controls.Add(new_radiobutton, 0, tbl_groups.RowCount - 1);
        tbl_groups.Controls.Add(new_rembutton, 1, tbl_groups.RowCount - 1);
    }

答案 4 :(得分:-1)

 <RadioButton Content="{content}" GroupName="RadioGroupIdentifier"/>

我猜是您要找的东西。

编辑

没有注意到您指的是获胜表格(您可能会在问题中写出来,因为标签在阅读时经常被跳过)。

但是,您应该阅读this article from microsoft,这是有用的部分:

  1. 从Windows窗体选项卡上的拖动一个GroupBox或Panel控件。 工具箱进入表单。
  2. 在GroupBox或Panel控件上绘制RadioButton控件。

通常,默认情况下,每个RadioButton都分组在父GroupBox或Panel中。

没有其他简单的方法可以通过设计器来做到这一点。 您当然可以通过事件buuuut实现自己的逻辑。...我不建议这样做。