Zbiór formularzy i kontenerów zawiera tylko najbliższe dzieci Controls
. Aby uzyskać wszystkie kontrole, trzeba przemierzać drzewa kontroli i zastosować tę operację rekurencyjnie
private void AddTextChangedHandler(Control parent)
{
foreach (Control c in parent.Controls)
{
if (c.GetType() == typeof(TextBox)) {
c.TextChanged += new EventHandler(C_TextChanged);
} else {
AddTextChangedHandler(c);
}
}
}
Uwaga: W wywodzi postaci (pośrednio) z Control
jak również i wszystkie kontrole mają Controls
kolekcję. Więc można wywołać metodę takiego w swojej formie:
AddTextChangedHandler(this);
Bardziej ogólnie rozwiązaniem byłoby tworzenie metodę rozszerzenia, które odnoszą się działania rekurencyjnie do wszystkich kontroli. W klasie statyczne (np WinFormsExtensions
) dodać metody:
public static void ForAllControls(this Control parent, Action<Control> action)
{
foreach (Control c in parent.Controls) {
action(c);
ForAllControls(c, action);
}
}
namespace klasy statyczne muszą być „widoczny”, to znaczy, dodanie odpowiedniego zgłoszenia using
jeżeli w innym nazw.
Następnie możesz to tak nazwać, gdzie jest this
; można również wymienić this
przez zmienną formularza lub kontrolnej, której zagnieżdżone kontrole mają zostać dotknięte:
this.ForAllControls(c =>
{
if (c.GetType() == typeof(TextBox)) {
c.TextChanged += C_TextChanged;
}
});
Możesz to zrobić w pętli rekurencyjnej. – jac