2013-09-28 4 views
0

попытаться включить или отключить некоторые элементы на моей форме (флажки и текстовые поля) Read this post, и переделать littlу Бит этот кодКак Contol все элементы на форме

код:

private void checkBoxEnableHotKeys_CheckedChanged(object sender, EventArgs e) 
    { 
     if (checkBoxEnableHotKeys.Checked) 
     { 
      EnableControls(this.Controls, true); 
     } //works perfect 
     if (!checkBoxEnableHotKeys.Checked) 
     { 
      EnableControls(this.Controls, false); 
     } //disable all controls 
    } 

    private void EnableControls(Control.ControlCollection controls, bool status) 
    { 
     foreach (Control c in controls) 
     { 
      c.Enabled = status;   
      if (c is MenuStrip) 
      { 
       c.Enabled = true; 
      } 
      if (c.Controls.Count > 0) 
      { 
       EnableControls(c.Controls, status); 
      } 
     } 
     checkBoxEnableHotKeys.Enabled = true; //not work 
    } 

где я ошибся? и почему checkBoxEnableHotKeys.Enabled = true; не работает? (- во время debagging эта часть передачи кода с ложным - и операция = не работает - false до и false после ...)

+2

Что на самом деле вы хотите сделать? Если вы хотите отключить некоторые элементы управления, помните, что ** Отключение элемента управления также отключит все его дочерние элементы управления. ** –

+0

проверка родителя 'checkBoxEnableHotKeys' отключена. если да, то вы включили его родителя, чтобы включить ребенка –

+0

oh! благодаря ! добавьте 'tableLayoutPanel1.Enabled = true;' перед 'checkBoxEnableHotKeys.Enabled = true;' - теперь это работа. - Отключение элемента управления также отключит все его дочерние элементы управления - NOTED, спасибо – gbk

ответ

1

Мне нравятся методы, возвращающие все дочерние элементы управления формы, включая вложенные элементы управления.

От: Foreach Control in form, how can I do something to all the TextBoxes in my Form?

Мне нравится ответ:

Хитрость в том, что Управление не является Список <> или IEnumerable, но ControlCollection.

Я рекомендую использовать расширение контроля, который будет возвращать что-то more..queriyable;)

public static IEnumerable<Control> All(this ControlCollection controls) 
    { 
     foreach (Control control in controls) 
     { 
      foreach (Control grandChild in control.Controls.All()) 
       yield return grandChild; 

      yield return control; 
     } 
    } 

Тогда вы можете сделать:

foreach(var textbox in this.Controls.All().OfType<TextBox>) 
{ 
    // Apply logic to the textbox here 
} 
+0

Хе-хе, мне жаль, что я не понял, что вы можете получить это свойство OfType на моей старой работе. В многочисленных проектах у меня был рекурсивный метод, который перебирал бы все дочерние элементы управления/управления и выполнял бы тонну различных действий на основе типа. Это сделало бы его настолько чище. – sab669

Смежные вопросы