8
votes

Trouver un contrôle sur une winforms à l'aide de Linq?

J'essaie de trouver un moyen élégant d'obtenir des contrôles sur un Formulaire Windows Formulaire par Nom. Par exemple: xxx

mais cela doit s'assurer qu'il passe à travers toutes les commandes de manière récursive.

Quel est le moyen le plus élégant de mettre en œuvre cette utilisation en utilisant LINQ ?


0 commentaires

5 Réponses :


8
votes

LINQ n'est pas nécessairement mieux adapté à une récursion de profondeur inconnue; Il suffit d'utiliser un code régulier ... xxx

avec: xxx

ou si vous n'aimez pas la récursivité ci-dessus: xxx


3 commentaires

Dans votre premier exemple, vous voulez dire que le retour de l'enfant.


Votre ligne de mise en œuvre d'exemple doit être Contrôle C = MyForm.FindControl ("MyTextBox"); , non?


@Brad assez peut-être; Depuis que c'était il y a plus de 3 ans, ma mémoire est brumeuse



1
votes

pas si facile ...

Linq n'est pas très bon lors de la récursion et Control.Controls n'est pas activé Linq activé (Besoins Cast).

Parfois, une méthode est la meilleure solution. Puisque vous pouvez écrire un qui fonctionne pour tous les contrôles, il sera encore plus réutilisable qu'une requête LINQ. Il pourrait s'agir d'une méthode d'extension.


0 commentaires

8
votes

Je ne pense pas que vous puissiez créer directement des requêtes de Linq récursives, mais vous pouvez créer une méthode récursive à l'aide de LINQ:

public Control FindInHierarchy(this Control control, string controlName)
{
    return control.FlattenHierarchy().FirstOrDefault(c => c.Name == controlName);
}


3 commentaires

C'est probablement la meilleure solution - en particulier étant donné que l'aplatirarchy peut être reforumée dans une méthode générique. Pourquoi éviteriez-vous d'utiliser Linq de cette manière?


@ALBAHARI - Oui, vous pensez probablement à ce sujet - j'ai d'abord pensé que cela pourrait être assez inefficace, mais c'est probablement bon.


+1 parce que vous l'avez fait avec Linq comme demandé, contre votre meilleur jugement



14
votes

Filtre de contrôle "élégant" (sans linq)

Merci à C # 3 Il existe de nombreuses solutions élégantes. Celui-ci n'utilise pas les opérateurs de requête LINQ; Il utilise des lambdas et des délégués. P>

Ce filtre Tous les contrôles des critères donnés (peuvent filtrer à plusieurs critères). Retourne plusieurs correspondances. Il permet de dépasser la détection de nom. P>

    static public Control FilterControlsOne(this Control start, Func<Control, bool> isMatch) {
        Control[] arrMatches = ControlExtensions.FilterControls(start, isMatch);
        return arrMatches.Length == 0 ? null : arrMatches[0];
    }


2 commentaires

Merci JDK, c'est vraiment bien. La seule chose est que j'ai besoin d'obtenir un seul résultat ou null. Obtenir un tableau est meilleur. Donc, peut-être que je devrais utiliser votre méthode de filtrage pour écrire un autre qui renvoie un seul contrôle ou null. Ceci est utilisé dans la manutention des événements, etc., donc j'ai besoin d'obtenir un seul contrôle et d'y ajouter l'événement.


Ajouté une extension pour renvoyer 1 contrôle ou null. Je ne cherche pas que cela soit la solution acceptée, je m'amuse simplement avec C # et laissant les résultats ici pour Perusal.



0
votes

Je me demande pourquoi personne n'a suggéré cela. XXX


0 commentaires