Скрытие различных элементов формы, указанных в списке
От: Mdel Россия  
Дата: 24.12.08 23:51
Оценка:
Помогите с решением вопроса, буду очень благодарен за решение:
C#. Net 2.0
Имеется список, содержащий имена объектов на форме, например:
tbxOK — кнопка,
tbxCancel — кнопка,
toolstripItemDone — элемент MenuItem,
ToolBtnInfo — элемент ToolStrip.
Список этот динамически меняется и мне необходимо, пройдя по всем контролам формы, сделать Enable=false для элементов из списка.
При проходе нижеследующим образом код работает только в том случае, если все контролы из списка являются кнопками, списками, текстовыми полями, т.е. у них родитель — основная форма:
foreach (DataRow row in viewAllTableAdapter.GetData(tbxLogin.Text, this.Name.ToString()))
//Получаем список контролов в указанной форме для отключения
{
this.Controls[row[2].ToString()].Enabled = false;
}
В случае, если я имею контрол типа toolstripItemDone — верхнее меню, и в нем например, Вид — Выделить все, то, само собой, он не дизейблится, т.к. он находится в контейнере MenuStrip.
В случае обхода таким путем:

foreach(Control ctr in this.Controls)
{
if(ctr.Name.ToString() == row[2].ToString())
 {
  ctr.Enabled = false;
 }
}


Все равно не проходит, т.к. форма ловит только MenuStrip, а его дочерние элементы не проходит.
Подскажите способ отключения/скрытия любого контрола независимо от его родителя? Способ:
this.Controls.Find("имя_контрола", true)[0].Enabled = false;
не работает, говорит что индекс вне диапазона.
Мне предложили вариант с предикатами:

public static bool ForEachInChildControlsTree(Control parent, Predicate action)
{
  foreach (Control c in parent.Controls)
   {
    if (action(c))
      return true;
    if (ForEachInChildControlsTree(c, action))
      return true;
   }
  return false;
}


............

ForEachInChildControlsTree(this /*форма или другой родитель*/, delegate(Control ctl)
{
   ctl.Enabled = ;
   return false;
});


Но я не могу разобраться, куда именно мне надо подставить имя из списка для отключения.
Если оставить код как приведен и вписать ctl.Enabled =false; то все элементы затеняются.
Если вместо this в параметре указать mytoolstrip, то ничего не происходит.
Подскажите, пожалуйста, в каком направлении копать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.