2010-08-31 13 views

Répondre

0

Vous aurez besoin d'une récursion pour parcourir tous les enfants de tous les contrôles. À moins qu'il y ait une raison pour laquelle vous devez implémenter cela avec LINQ (je suppose que vous voulez dire lambdas), vous pouvez essayer this approach using Generics à la place.

11

Une technique que j'ai vu est de créer une méthode d'extension sur ControlCollection qui retourne un IEnumerable ... quelque chose comme ceci:

public static IEnumerable<Control> FindAll(this ControlCollection collection) 
{ 
    foreach (Control item in collection) 
    { 
     yield return item; 

     if (item.HasControls()) 
     { 
      foreach (var subItem in item.Controls.FindAll()) 
      { 
       yield return subItem; 
      } 
     } 
    } 
} 

qui gère la récursion. Ensuite, vous pouvez l'utiliser sur votre page comme ceci:

var textboxes = this.Controls.FindAll().OfType<TextBox>(); 

qui vous donnerait toutes les zones de texte sur la page. Vous pouvez aller plus loin et créer une version générique de votre méthode d'extension qui gère le filtrage de type. Il pourrait ressembler à ceci:

public static IEnumerable<T> FindAll<T>(this ControlCollection collection) where T: Control 
{ 
    return collection.FindAll().OfType<T>(); 
} 

et vous pouvez l'utiliser comme ceci:

var textboxes = this.Controls.FindAll<TextBox>().Where(t=>t.Visible); 
+0

Cette solution ne recherche pas récursivement l'arbre de contrôle. La recherche est superficielle. –

0

http://www.dotnetperls.com/query-windows-forms fournit le meilleur ensemble de réponses que j'ai trouvé à cette question. J'ai choisi la version LINQ:

/// <summary> 
/// Use a LINQ query to find the first focused text box on a windows form. 
/// </summary> 
public TextBox TextBoxFocusedFirst1() 
{ 
    var res = from box in this.Controls.OfType<TextBox>() 
      where box.Focused == true 
      select box; 
    return res.First(); 
} 
0

Si votre page a une page maître et que vous connaissez le nom de l'espace réservé du contenu, c'est plutôt facile. Je fais quelque chose de similaire mais avec des panneaux Web

private void SetPanelVis(string PanelName) 
{ 
    Control topcontent = Form.FindControl("MainContent");   
    foreach (Control item in topcontent.Controls.OfType<Panel>()) 
    { 
     item.Visible = (item.ID == RadioButtonList1.SelectedValue); 
    } 
}