C #: как избежать нескольких проверенных RadioButtons - PullRequest
0 голосов
/ 26 июня 2018

В обычных условиях на панели можно одновременно проверять только одну кнопку RadioButton.

Теперь у меня есть панель (в основном для вертикальной прокрутки), содержащая двухколоночную TableLayoutPanel. Новые строки можно добавлять в TLP бесконечно, нажав кнопку «Добавить строку» (вот почему мне нужна панель для прокрутки вниз).

Каждая строка в TLP выглядит одинаково:

Первый столбец содержит другой TLP с одним столбцом и двумя строками. Первая строка содержит только RadioButton, вторая строка содержит только другую кнопку.

Второй столбец содержит CheckedListBox.

Итак, скажем, я добавил 5 строк в TLP. Итак, у меня есть 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 голосов
/ 26 июня 2018

Я сделал несколько изменений в вашем коде и прокомментировал старый код. Пожалуйста, попробуйте это. В этом коде я добавляю новую строку в существующий элемент управления 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);
    }
0 голосов
/ 26 июня 2018

Чтобы некоторые переключатели работали как группа, вы должны разместить их в одном контейнере. Разные таблицы раскладки панелей отличаются контейнером. Описывает поведение.

Если по какой-либо причине вы хотите сохранить макет как есть, вам нужно установить для свойства 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;
    }
}
0 голосов
/ 26 июня 2018
 <RadioButton Content="{content}" GroupName="RadioGroupIdentifier"/>

Я думаю, это то, что вы ищете.

РЕДАКТИРОВАТЬ

Не заметил, что вы имели в виду выигрышные формы (вы могли бы написать это в вопросе, поскольку теги часто пропускаются при чтении).

Однако, вы должны прочитать эту статью от Microsoft , вот полезная часть:

  1. Перетащите элемент управления GroupBox или Panel с вкладки Windows Forms на Панель инструментов на форму.
  2. Отрисовка элементов управления RadioButton на элементе управления GroupBox или Panel.

Как правило, каждый RadioButton сгруппирован внутри родительского GroupBox или Panel по умолчанию.

Нет другого простого способа сделать это только через дизайнера. Конечно, вы можете реализовать свою собственную логику с помощью событий buuuut .... Я бы не рекомендовал это.

0 голосов
/ 26 июня 2018

Попробуй это. Это может сработать для вас.

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);
0 голосов
/ 26 июня 2018

Использовать свойство GroupName для Radiobutton.

...