Existe-t-il un moyen d'utiliser linq pour obtenir une liste de zones de texte dans une page Web indépendamment de leur position dans la hiérarchie ou les conteneurs. Ainsi, au lieu de faire défiler la ControlCollection de chaque conteneur pour trouver les zones de texte, faites la même chose dans linq, peut-être dans une seule instruction linq?Utilisation de linq pour obtenir la liste des contrôles Web d'un certain type dans une page Web
Répondre
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.
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);
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();
}
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);
}
}
Cette solution ne recherche pas récursivement l'arbre de contrôle. La recherche est superficielle. –