J'ai besoin d'obtenir tous les contrôles sur un formulaire de type x. Je suis à peu près sûr d'avoir vu ce code une fois dans le passé qui utilisait quelque chose comme ceci:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Je sais que je peux parcourir tous les contrôles pour que les enfants utilisent une fonction récursive, mais y a-t-il quelque chose de plus facile ou de plus simple, peut-être comme ce qui suit?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Réponses:
Voici une autre option pour vous. Je l'ai testé en créant un exemple d'application, j'ai ensuite mis une GroupBox et une GroupBox dans la GroupBox initiale. À l'intérieur de la GroupBox imbriquée, j'ai mis 3 contrôles TextBox et un bouton. C'est le code que j'ai utilisé (inclut même la récursivité que vous recherchiez)
Pour le tester dans l'événement de chargement de formulaire, je voulais un nombre de tous les contrôles à l'intérieur de la GroupBox initiale
Et il a renvoyé le compte correct à chaque fois, donc je pense que cela fonctionnera parfaitement pour ce que vous recherchez :)
la source
En C # (puisque vous l'avez marqué comme tel), vous pouvez utiliser une expression LINQ comme celle-ci:
Modifier pour la récursivité:
Dans cet exemple, vous créez d'abord la liste des contrôles, puis appelez une méthode pour la remplir. Puisque la méthode est récursive, elle ne renvoie pas la liste, elle la met simplement à jour.
Il peut être possible de le faire dans une instruction LINQ en utilisant la
Descendants
fonction, bien que je ne sois pas aussi familier avec elle. Consultez cette page pour plus d'informations à ce sujet.Modifier 2 pour renvoyer une collection:
Comme @ProfK l'a suggéré, une méthode qui renvoie simplement les contrôles souhaités est probablement une meilleure pratique. Pour illustrer cela, j'ai modifié le code comme suit:
la source
Il s'agit d'une version améliorée de la GetAllControls () récursive qui fonctionne réellement sur les variables privées:
la source
J'ai combiné un tas d'idées précédentes en une seule méthode d'extension. Les avantages ici sont que vous récupérez l'énumérable correctement tapé et que l'héritage est géré correctement par
OfType()
.la source
Vous pouvez utiliser une requête LINQ pour ce faire. Cela interrogera tout sur le formulaire qui est de type TextBox
la source
var c = this.Controls.OfType<TextBox>()
donnerait-il pas le même résultat?C'est peut-être l'ancienne technique, mais cela fonctionne comme du charme. J'ai utilisé la récursivité pour changer la couleur de toutes les étiquettes du contrôle. Cela fonctionne très bien.
la source
J'aimerais modifier la réponse de PsychoCoders: comme l'utilisateur souhaite obtenir tous les contrôles d'un certain type, nous pourrions utiliser des génériques de la manière suivante:
De cette façon, nous pouvons appeler la fonction comme suit:
la source
.OfType<T>()
méthode Linq plutôt que.Where(c => c.GetType() == typeof(T)).Cast<T>();
d'obtenir le même effet?N'oubliez pas que vous pouvez également avoir une zone de texte dans d'autres contrôles autres que les contrôles de conteneur. Vous pouvez même ajouter un TextBox à un PictureBox.
Vous devez donc également vérifier si
dans toute fonction récursive.
Voici le résultat que j'ai eu d'une mise en page pour tester ce code:
Essayez ceci avec un bouton et un RichTextBox sur un formulaire.
la source
Utilisation de la réflexion:
la source
Voici ma méthode d'extension pour
Control
, en utilisant LINQ, comme une adaptation de la version @PsychoCoder :Il prend une liste de types à la place qui vous permet de ne pas avoir besoin de plusieurs appels
GetAll
pour obtenir ce que vous voulez. Je l'utilise actuellement comme version de surcharge.Usage:
la source
Une solution propre et simple (C #):
Obtenez toutes les zones de texte:
la source
Vous pouvez utiliser le code ci-dessous
la source
Voici ma méthode d'extension. C'est très efficace et c'est paresseux.
Usage:
Le code est:
la source
Voici la solution.
https://stackoverflow.com/a/19224936/1147352
J'ai écrit ce morceau de code et sélectionné uniquement les panneaux, vous pouvez ajouter plus de commutateurs ou de ifs. dedans
la source
la source
Expressions lambda
la source
J'ai modifié de @PsychoCoder. Tous les contrôles peuvent être trouvés maintenant (y compris imbriqués).
la source
Cela peut fonctionner:
Je pense que la fonction permettant d'obtenir tous les contrôles dont vous parlez n'est disponible que pour WPF .
la source
Voici une solution générique testée et fonctionnelle:
J'ai un grand nombre de contrôles UpDownNumeric, certains sous la forme principale, d'autres dans des boîtes de groupe dans le formulaire. Je veux que seul le dernier contrôle sélectionné change la couleur de fond en vert, pour lequel j'ai d'abord défini tous les autres sur blanc, en utilisant cette méthode: (peut également s'étendre aux petits-enfants)
la source
Vous pouvez essayer ceci si vous le souhaitez :)
la source
Bien que plusieurs autres utilisateurs aient publié des solutions adéquates, j'aimerais publier une approche plus générale qui pourrait être plus utile.
Ceci est largement basé sur la réponse de JYelton.
la source
la source
la source
Pour tous ceux qui recherchent une version VB du code C # d'Adam écrit comme une extension de la
Control
classe:REMARQUE: j'ai ajouté la
BaseType
correspondance pour tous les contrôles personnalisés dérivés. Vous pouvez le supprimer ou même en faire un paramètre facultatif si vous le souhaitez.Usage
la source
Créer une méthode
Et utilisez-le comme
la source
J'utilise VB, donc j'ai écrit une méthode d'extension. Qui récupère tous les enfants et sous-enfants d'un contrôle
Ensuite, vous pouvez l'utiliser comme, où "btnList" est un contrôle
Dans ce cas, il sélectionnera le bouton radio sélectionné.
la source
Simplement:
la source