J'essaie de trouver un moyen élégant d'obtenir des contrôles sur un Formulaire Windows Formulaire par Nom. Par exemple: mais cela doit s'assurer qu'il passe à travers toutes les commandes de manière récursive. P> Quel est le moyen le plus élégant de mettre en œuvre cette utilisation en utilisant LINQ ? P> P>
5 Réponses :
LINQ n'est pas nécessairement mieux adapté à une récursion de profondeur inconnue; Il suffit d'utiliser un code régulier ... avec: p> ou si vous n'aimez pas la récursivité ci-dessus: p>
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"); Code>, non?
@Brad assez peut-être; Depuis que c'était il y a plus de 3 ans, ma mémoire est brumeuse
pas si facile ... p>
Linq n'est pas très bon lors de la récursion 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. P> et Control.Controls code> n'est pas activé Linq activé Strike> (Besoins Cast). p>
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);
}
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
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];
}
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.
Je me demande pourquoi personne n'a suggéré cela.