Здравствуйте, Mdel, Вы писали:
M>Помогите с решением вопроса, буду очень благодарен за решение:
M>C#. Net 2.0
M>Имеется список, содержащий имена объектов на форме, например:
M>tbxOK — кнопка,
M>tbxCancel — кнопка,
M>toolstripItemDone — элемент MenuItem,
M>ToolBtnInfo — элемент ToolStrip.
M>Список этот динамически меняется и мне необходимо, пройдя по всем контролам формы, сделать Enable=false для элементов из списка.
M>При проходе нижеследующим образом код работает только в том случае, если все контролы из списка являются кнопками, списками, текстовыми полями, т.е. у них родитель — основная форма:
M>foreach (DataRow row in viewAllTableAdapter.GetData(tbxLogin.Text, this.Name.ToString()))
M>//Получаем список контролов в указанной форме для отключения
M>{
M>this.Controls[row[2].ToString()].Enabled = false;
M>}
M>В случае, если я имею контрол типа toolstripItemDone — верхнее меню, и в нем например, Вид — Выделить все, то, само собой, он не дизейблится, т.к. он находится в контейнере MenuStrip.
M>В случае обхода таким путем:
M>M>foreach(Control ctr in this.Controls)
M>{
M>if(ctr.Name.ToString() == row[2].ToString())
M> {
M> ctr.Enabled = false;
M> }
M>}
M>
M>Все равно не проходит, т.к. форма ловит только MenuStrip, а его дочерние элементы не проходит.
M>Подскажите способ отключения/скрытия любого контрола независимо от его родителя? Способ:
M>this.Controls.Find("имя_контрола", true)[0].Enabled = false;
M>не работает, говорит что индекс вне диапазона.
M>Мне предложили вариант с предикатами:
M>M>public static bool ForEachInChildControlsTree(Control parent, Predicate action)
M>{
M> foreach (Control c in parent.Controls)
M> {
M> if (action(c))
M> return true;
M> if (ForEachInChildControlsTree(c, action))
M> return true;
M> }
M> return false;
M>}
M>
M>............
M>M>ForEachInChildControlsTree(this /*форма или другой родитель*/, delegate(Control ctl)
M>{
M> ctl.Enabled = ;
M> return false;
M>});
M>
M>Но я не могу разобраться, куда именно мне надо подставить имя из списка для отключения.
M>Если оставить код как приведен и вписать ctl.Enabled =false; то все элементы затеняются.
M>Если вместо this в параметре указать mytoolstrip, то ничего не происходит.
M>Подскажите, пожалуйста, в каком направлении копать?
Объяснять долго мне некогда, код понятный, помоему по поиску чего либо в любом контейнере
foreach (Control Cntrl in groupBoxПроверка.Controls)//ищем все чекеты на групповой панели проверки знаний
{
if (Cntrl is CheckBox)//if (((CheckBox)Cntrl).Checked) a += b;
{
ИмяЧекета = ((CheckBox)Cntrl).Name; ИДчекета = ИмяЧекета.Split ( '_' );
ID_Ответа = Convert.ToInt32( ИДчекета[1]);
UserОтвет = this.документыDataSet.Ответы.FindByОтветID ( ID_Ответа );
if (((CheckBox)Cntrl).Checked != UserОтвет.ДаНет) ПравилДаНет += 1;
if (((CheckBox)Cntrl).Checked == UserОтвет.ДаНет) НеПравилДаНет += 1;
}
}
вот кусок из моей программы, если так делеко залез то разберешся.
GSE==