Вот как я сделал что-то подобное:
В базовом классе формы, от которого наследуются мои формы (который, в свою очередь, наследует от формы) ....
#region Form Fields Enablers
protected virtual void EnableFormFields(Control ctl)
{
EnableFormFields(ctl, true);
}
protected virtual void DisableFormFields(Control ctl)
{
EnableFormFields(ctl, false);
}
protected virtual void EnableFormFields(Control ctl, bool enable)
{
EnableFormFields(ctl, enable, new string[0]);
}
protected virtual void EnableFormFields(Control ctl, bool enable, params string[] excludeControlName)
{
bool exclude = false;
foreach (string excludeCtl in excludeControlName)
{
if (string.Compare(ctl.Name, excludeCtl, true) == 0)
{
exclude = true;
break;
}
}
if (!exclude)
{
ctl.Enabled = enable;
foreach (Control childCtl in ctl.Controls)
{
EnableFormFields(childCtl, enable, excludeControlName);
}
}
}
#endregion Form Fields Enablers
Затем в конкретной форме я вызываю this.EnableFormFields(someContainerControl)
, когда хочу установить все элементы управления в данном контейнере, например все элементы управления на всех вкладках (tabcontrol) или все элементы управления на одной вкладке (tabpage), или даже все элементы управления в форме (передавая "this") и т. д. Я могу даже исключить некоторые элементы управления, передав их имена в виде массива строк, или каждое такое имя в качестве отдельного конечного параметра ("params" в списке параметров определения метода) ).
Я думаю, это то, что искал Джон. Важным примечанием для новичка является рекурсивность этого кода, установка свойства Enable для данного элемента управления, а затем вызов метода для установки свойства Enable в каждом из дочерних элементов управления. Каждый из них, в свою очередь, устанавливает свойство своих дочерних элементов управления.
Спасибо,
John