Почему не изменяется свойство контрола?

367
13 января 2017, 07:19
private void HideAll()
{
   foreach (TextBox tb in this.Controls.OfType<TextBox>())
      tb.Enabled = false;
}

У меня есть четыре TextBox и один ComboBox. В зависимости от выбранного элемента в ComboBox, нужно включить/выключить (Enabled) TextBox.

Самый, как я счел, оптимальный вариант - это сначала все отключить и потом включить нужные, но функция почему-то вообще не вызывается, даже вставлял MessageBox - всё тщетно.

Подскажите, пожалуйста, в чем дело или другой оптимальный вариант, т.к в своем варианте я не учел, что на форме будут скрыты все TextBox (у меня их на самом деле не четыре, а больше)

comboBox1.SelectedIndexChanged += (s, e) => {
    comboBox2.Items.Clear();
    if (comboBox1.SelectedIndex == 0) {
        HideAll();
        textBoxAn1.Enabled = true;
        textBoxAn2.Enabled = true;
    }
    else if (comboBox1.SelectedIndex == 1) {
        HideAll();
        textBoxAn1.Enabled = true;
        textBoxAn2.Enabled = true;
        textBoxAn3.Enabled = true;
    }
    else if (comboBox1.SelectedIndex == 2) {
        HideAll();
        textBoxAn1.Enabled = true;
        textBoxAn2.Enabled = true;
        textBoxAn3.Enabled = true;
        textBoxAn4.Enabled = true;
    }
    comboBox2.SelectedIndex = 0;
};
Answer 1

Свойство Controls для элемента управления возвращает только те элементы, которые непосредственно в нем находятся. Для обхода всех элементов (включая вложенные) используйте рекурсивный вариант:

    public static IEnumerable<Control> GetAll(this Control control)
    {
        var controls = control.Controls.Cast<Control>();
        return controls.SelectMany(ctrl => GetAll(ctrl)).Concat(controls);
    }

В вашем случае это не нужно, т.к. достаточно просто указать для перебора группирующий элемент:

foreach (TextBox tb in groupBox1.Controls.OfType<TextBox>())
READ ALSO
Чат-Бот VK C#, парсинг страницы

Чат-Бот VK C#, парсинг страницы

Привет, задача такаяДобавляю бота в конференцию и пишу

623
WCF: получение IP клиента

WCF: получение IP клиента

Есть WCF-сервис, крутится на сервере на IISeОн должен логировать IP клиентов, подключившихся к нему

471
ThreadAbortException при вызове Response.End

ThreadAbortException при вызове Response.End

Проблема в том, что метод ResponseEnd вызывает исключение ThreadAbortException, которое мешает дебажить

353