È necessario utilizzare la ricorsione. La seguente è una soluzione C# che usa un metodo di estensione e va un po 'oltre la portata della tua domanda, ma l'ho appena estratta dal nostro framework.
static partial class ControlExtensions
{
public static void ApplyToMatchingChild(this Control parent, Action<Control> actionToApplyWhenFound, bool keepApplyingForever, params Func<Control, bool>[] matchingChildCriteria)
{
ControlEventHandler reapplyEventHandler = null;
if (keepApplyingForever)
{
reapplyEventHandler = (s, e) =>
{
ApplyToMatchingChild(e.Control, actionToApplyWhenFound, keepApplyingForever, matchingChildCriteria);
};
}
SearchForMatchingChildTypes(parent, actionToApplyWhenFound, reapplyEventHandler, matchingChildCriteria);
}
private static void SearchForMatchingChildTypes(Control control, Action<Control> actionToApplyWhenFound, ControlEventHandler reapplyEventHandler, params Func<Control, bool>[] matchingChildCriteria)
{
if (matchingChildCriteria.Any(criteria => criteria(control)))
{
actionToApplyWhenFound(control);
}
if (reapplyEventHandler != null)
{
control.ControlAdded += reapplyEventHandler;
}
if (control.HasChildren)
{
foreach (var ctl in control.Controls.Cast<Control>())
{
SearchForMatchingChildTypes(ctl, actionToApplyWhenFound, reapplyEventHandler, matchingChildCriteria);
}
}
}
}
e di chiamare:
myControl.ApplyToMatchingChild(c => { /* Do Stuff to c */ return; }, false, c => c is TextBox);
che si applica una funzione per tutte le caselle di testo per bambini. È possibile utilizzare il parametro keepApplyingForever
per garantire che la funzione venga applicata quando vengono aggiunti in seguito i controlli figlio. La funzione consentirà inoltre di specificare qualsiasi numero di criteri di corrispondenza, ad esempio se il controllo è anche un'etichetta o altri criteri.
In realtà usiamo questo come un modo pulito per chiamare il nostro contenitore di iniezione dipendenza per ogni UserControl aggiunto al nostro modulo.
Sono sicuro che non dovresti avere molti problemi anche converting it to VB.NET ... Inoltre, se non vuoi la funzionalità "keepApplyingForever", dovrebbe essere abbastanza semplice da eliminare anche quella.
Eventuali duplicati di [Come ottenere tutti i controlli figlio di un Windows Form forma di un tipo specifico (Pulsante/casella di testo)?] (Https://stackoverflow.com/questions/3419159/how-to-get -ALL-bambini-controlli-di-un-windows-forme-forma-di-un-tipo specifico pulsante) – PulseJet