9
votes

Trouver un contrôle sous Windows Formulaires par nom

Je travaille sur une application qui ajoutez des objets (fondamentalement Formulaires Windows Controls) au moment de l'exécution à partir d'un fichier XML. L'application doit accéder aux objets ajoutés.

Les objets sont ajoutés dans un panneau ou dans une boîte groupée. Pour le panneau et la groupbox, j'ai un panneau.Controls ["Nom d'objet"] pour accéder aux objets. Ceci n'est utile que lorsque l'objet est directement ajouté sur le même panneau. Dans mon cas, le panneau principal [Pnlmain, j'ai accès uniquement à ce panneau] peut contenir un autre panneau et ce panneau [PnlChild] contient à nouveau une touche groupbox [gbpnllild] et la boîte de groupe contient une touche [Bouton1, je souhaite accéder à ce bouton] . J'ai la méthode suivante pour cela: xxx

La méthode ci-dessus est utile lorsque les parents sont connus. Dans mon scénario, seul le nom de l'objet est connu à accéder à [Button1] et non à ses parents. Alors, comment puis-je accéder à cet objet par son nom, non pertinent de son parent?

existe une méthode comme getObject ("objname") ou quelque chose de similaire?


0 commentaires

4 Réponses :


28
votes

Vous pouvez utiliser le formulaire Controls.find () méthode pour récupérer une référence en arrière: xxx

méfiez-vous que cela renvoie un tableau , la propriété Nom d'un contrôle peut être ambiguë, il y a Aucun mécanisme qui garantit qu'un contrôle a un nom unique. Vous devrez vous faire respecter vous-même.


1 commentaires

Est-ce une recherche sensible à la casse?



2
votes

Le .NET Compact Framework ne prend pas en charge Control.ControlCollection.Find.Find.

voir Control.controlcollection Methods et noter qu'il n'y a pas d'icône de téléphone à côté de la méthode de recherche.

Dans ce cas, définissez la méthode suivante: xxx

puis utilisez-le comme ceci: xxx < / p>


0 commentaires

3
votes
  TextBox txtAmnt = (TextBox)this.Controls.Find("txtAmnt" + (i + 1), false).FirstOrDefault();
This works when you know what you are loking for.

1 commentaires

Le +1 dans l'expression m'a sauvé d'un bug!



4
votes

Si vous êtes dans un contrôle utilisateur et ne disposez pas d'un accès direct au formulaire de conteneur, vous pouvez effectuer les éléments suivants

var parent = this.FindForm(); // returns the object of the form containing the current usercontrol.
var findButton = parent.Controls.Find("button1",true).FirstOrDefault();
if(findButton!=null)
{
    findButton.Enabled =true; // or whichever property you want to change.
}


0 commentaires