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;
};
Свойство 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>())
Сборка персонального компьютера от Artline: умный выбор для современных пользователей