2009-09-13 8 views
4

J'ai un formulaire MainForm qui est un formulaire Windows Forms qui contient de nombreux contrôles enfants. Je veux appeler une fonction sur MainForm qui avertit tous ses enfants. Le formulaire Windows Forms fournit-il un moyen de le faire? J'ai joué avec mise à jour, rafraîchir et invalider sans succès.Notifier récursivement les contrôles enfants via C#

+1

Que voulez-vous dire par « informer »? –

Répondre

6
foreach (Control ctrl in this.Controls) 
{ 
    // call whatever you want on ctrl 
} 

Si vous souhaitez accéder à tous les contrôles du formulaire, ainsi que tous les contrôles de chaque contrôle sur le formulaire (et ainsi de suite, récursive), utiliser une fonction comme ceci:

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); 
    } 
} 

... que vous appelez en passant d'abord dans la collection de contrôles de la forme, comme ceci:

DoSomething(this.Controls); 
+0

Je voudrais mettre en œuvre DoSomething dans une interface comme "ICanDoSomething" et prrof cette interface dans le foreach. Vous devez donc ajouter uniquement cette interface pour chaque contrôle. –

1

Non, il n'y en a pas. Vous devez sortir le vôtre. Sur une note de côté - WPF a "routé des événements" qui est exactement cela et plus encore.

-2

vous allez avoir besoin d'une méthode récursive pour le faire (comme ci-dessous), parce que les contrôles peuvent avoir des enfants.

void NotifyChildren(control parent) 
{ 
    if (parent == null) return; 
    parent.notify(); 
    foreach(control child in parent.children) 
    { 
     NotifyChildren(child); 
    } 
} 
+0

Quelle langue est-ce? – MusiGenesis

+0

comme le dit le titre de la question, c'est C# –

+2

Les contrôles dans WinForms n'ont pas de collection "enfants". – MusiGenesis

2

La réponse de MusiGenesis est élégante, (typique d'une bonne manière), agréable et propre.

Mais juste pour offrir une alternative en utilisant des expressions lambda et une « action » pour un autre type de récursion:

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); 
Questions connexes