Очистить все переключатели на странице - PullRequest
4 голосов
/ 11 августа 2011

В моем проекте Windows Forms есть много динамически генерируемых переключателей. Они могут быть проверены на основе значений в базе данных. Я хочу очистить все переключатели одним нажатием кнопки. Как я могу это сделать?

Ответы [ 5 ]

7 голосов
/ 12 августа 2011

Проверьте это:

private void button1_Click(object sender, EventArgs e) 
{
    var cntls = GetAll(this, typeof(RadioButton));
    foreach (Control cntrl in cntls)
    {
        RadioButton _rb = (RadioButton)cntrl;
        if (_rb.Checked)
        {
            _rb.Checked = false;
        }
    }
}

public IEnumerable<Control> GetAll(Control control, Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrls => GetAll(ctrls, type)).Concat(controls).Where(c => c.GetType() == type);
}
5 голосов
/ 11 августа 2011

Оба будут делать это ниже, пока _radioContainer является GroupBox.

private void button1_Click(object sender, EventArgs e) {

    // This will remove the radiobuttons completely...
    _radioContainer.Controls.OfType<RadioButton>().ToList().ForEach(p => _radioContainer.Controls.Remove(p));

    // Either of the below will clear the checked state
    _radioContainer.Controls.OfType<RadioButton>().ToList().ForEach(p => p.Checked = false);

    foreach (RadioButton radio in _radioContainer.Controls.OfType<RadioButton>().ToList()) {
        if (radio.Checked == true) {
            radio.Checked = false;
            break;
        }
    }
}
1 голос
/ 22 сентября 2016

Я столкнулся с подобной проблемой, где ни один из этих ответов не был полезен.

Я хотел инициализировать диалоговое окно Winform с 2-мя радиокнопками, которые должны быть отключены. Пользователь должен сделать явный выбор, прежде чем что-то будет выбрано (как в этом вопросе: https://ux.stackexchange.com/questions/76181/radio-buttons-with-none-selected).

Проблема заключалась в том, что первая кнопка RadioButton (кнопка с более низким значением TabIndex) всегда была предварительно проверена. Снимите флажок вручную, просто отметьте другой (неважно, в конструкторе или на событии Load).

Разрешение: установите для свойства TabStop значение false для обоих RadioButtons. Не спрашивайте меня, почему.

1 голос
/ 11 августа 2011

Я не знаю, так ли это, но у вас могут быть переключатели, вложенные в другие элементы управления. Если это так, вам нужно будет просмотреть все коллекции .Controls всех ваших элементов управления, чтобы найти их все и отключить. Вы можете использовать эту вспомогательную функцию для этого:

    void ExecuteOnAllChildren<U>(Control c, Action<Control> T) where U : Control
    {
        c.Controls.OfType<U>().ToList().ForEach(a => T(a) );

        foreach(Control childControl in c.Controls)
            ExecuteOnAllChildren<U>(childControl, T);

    }

Используйте это, сказав:

    ExecuteOnAllChildren<RadioButton>(this, a => { a.Checked = false; });

(Я предполагаю, что «это» - ваша форма. В противном случае замените «это» той формой, с которой вы хотели бы выполнить все замены.)

0 голосов
/ 19 января 2015
void Button1Click(object sender, EventArgs e)
{
    foreach (Control ctrl in Controls)
    {
        if (ctrl is Panel)
        {
            foreach (Control rdb in ctrl.Controls)
            {
                if (rdb is RadioButton && ((RadioButton)rdb).Checked == true)
                {
                    ((RadioButton)rdb).Checked = false;
                }
            }
        }
    }
}

Это удаляет все отмеченные переключатели при нажатии кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...