2013-07-06 1 views
0

У меня есть следующие функции:C# WinForms - Цитирование всех элементов управления для применения обработчика событий, не работающего в SplitContainer?

private void setupFocusControls(Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      control.GotFocus += HandleFocus; 
     } 
    } 

    private void HandleFocus(object sender, EventArgs e) 
    { 
     Control control = (Control)sender; 
     thisFormName = this.Name; 
     thisControlName = control.Name.ToString(); 


     if (bHelpSystemActive) 
     { 
      bHelpSystemActive = false; 

      if ((ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       HelpSystem hs = new HelpSystem(thisFormName, thisControlName); 
       hs.ShowDialog(); 
      } 
      else 
      { 
       showTooltipForControl(control, thisFormName); 
      } 


      return; 
     } 
    } 

И я называю это в функции Form_Load:

private void Labeller_Load(object sender, EventArgs e) 
    { 
     setupFocusControls(this); 
     fillListBox(); 
    } 

Что это делает показать пользовательскую систему помощи, которую я написал. Если контрольный ключ не нажат, я покажу информацию в подсказке. Если нажать клавишу управления, я покажу редактор. Просто на самом деле.

Теперь этот код отлично работает в другой форме, которая использует панели в качестве контейнеров для элементов управления формы. Проблема в том, что теперь я хочу добавить эту функциональность в отдельную форму. Я добавил весь код, но ни один из элементов управления в форме не добавил к ним событие HandleFocus. Единственная разница между этой формой и рабочей состоит в том, что она использует splitContainer как контейнер.

Вопрос в том, почему функция setupFocusControls не зацикливается через splitContainer, так как это панели на моей рабочей форме? И как я могу это исправить? У меня, очевидно, не было бы нескольких функций для выполнения этой (что я думал) простой задачи ...

Cheers.

+1

Хотите _every_ управления на форме провести мероприятие? Или просто верхний уровень? Если вам нужен каждый элемент управления, вам нужно использовать рекурсию для назначения события каждому элементу управления. – feralin

+0

Можете ли вы показать свой код «OnLoad» для формы контейнера с разделом, пожалуйста? – Michael

+0

Да, каждый элемент управления должен иметь это событие, так как моя справочная система настроена на основе управления. то есть подробно описывая каждый элемент управления и для чего он предназначен. Как мне это сделать? У меня есть 50+ элементов управления в другой форме, и он отлично работает с использованием вышеуказанного метода. Я думал, что это применимо красиво :( – LokiSinclair

ответ

2

Если предположить, что проблема заключается в том, что вы не назначаем событие каждый один элемент управления на форме (управление только верхнего уровня), исправление должно быть, чтобы изменить setupFocusControls(Control) метод:

private void setupFocusControls(Control parent) 
{ 
    foreach (Control control in parent.Controls) 
    { 
     control.GotFocus += HandleFocus; 
     // add the following line to recurse throughout the control tree 
     setupFocusControls(control); 
    } 
} 

Это добавит обработчик события HandleFocus в каждый единый контроль, путем рекурсии через дочерние элементы каждого элемента управления. Надеюсь, это сработает для вас!

В качестве бонуса, если вы хотите, чтобы добавить обработчик событий для всех элементов управления, включая контрольной parent, вы могли бы написать метод setupFocusControls следующим образом:

private void setupFocusControls(Control parent) 
{ 
    parent.GotFocus += HandleFocus; 
    foreach (Control child in parent.Children) 
     setupFocusControls(child); 
} 
Смежные вопросы