Рекурсивно уведомлять дочерние элементы управления через C # - PullRequest
4 голосов
/ 13 сентября 2009

У меня есть форма MainForm, которая является формой Windows Forms, которая содержит много дочерних элементов управления. Я хочу вызвать одну функцию на MainForm, которая уведомляет всех ее потомков. Предоставляет ли форма Windows Forms средство для этого? Я играл с обновлением, обновлением и аннулированием без успеха.

Ответы [ 4 ]

6 голосов
/ 13 сентября 2009
foreach (Control ctrl in this.Controls)
{
    // call whatever you want on ctrl
}

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

public void DoSomething(Control.ControlCollection controls)
{
    foreach (Control ctrl in controls)
    {
        // do something to ctrl
        MessageBox.Show(ctrl.Name);
        // recurse through all child controls
        DoSomething(ctrl.Controls);
    }
}

... который вы вызываете, изначально передавая коллекцию Controls формы, например:

DoSomething(this.Controls);
2 голосов
/ 14 сентября 2009

Ответ от MusiGenesis элегантный, (типично хороший), красивый и чистый.

Но только для того, чтобы предложить альтернативу, использующую лямбда-выражения и «Действие» для другого типа рекурсии:

Action<Control> traverse = null;

//in a function:
traverse = (ctrl) =>
    {
         ctrl.Enabled = false; //or whatever action you're performing
         traverse = (ctrl2) => ctrl.Controls.GetEnumerator();
    };

//kick off the recursion:
traverse(rootControl);
1 голос
/ 13 сентября 2009

Нет, нет. Вы должны выкатить свой собственный.

На заметку о том, что в WPF есть «перенаправленные события», именно это и многое другое.

0 голосов
/ 13 сентября 2009

Для этого вам понадобится рекурсивный метод (как показано ниже), поскольку у элементов управления могут быть дочерние элементы.

void NotifyChildren( control parent )
{
    if ( parent == null ) return;
    parent.notify();
    foreach( control child in parent.children )
    {
        NotifyChildren( child );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...