Rechercher un contrôle dans Windows Forms par nom

Je travaille sur une application qui ajoute des objects (essentiellement des contrôles Windows Forms ) au moment de l’exécution à partir d’un fichier XML. L’application doit accéder aux objects ajoutés.

Les objects sont ajoutés dans un panneau ou une zone de groupe. Pour le panneau et la zone de groupe, j’ai Panel.Controls [“nom_object”] pour accéder aux objects. Cela n’est utile que lorsque l’object est ajouté directement sur le même panneau. Dans mon cas, le panneau principal [pnlMain, j’ai access à ce panneau uniquement] peut contenir un autre panneau et ce panneau [pnlChild] contient à nouveau une zone de groupe [gbPnlChild] et la zone de groupe contient un bouton [button1, je souhaite accéder à ce bouton] . J’ai la méthode suivante pour cela:

Panel childPanel = pnlMain.Controls["pnlChild"]; GroupBox childGP = childPanel.Controls["gbPnlChild"]; Button buttonToAccess = childGP["button1"]; 

La méthode ci-dessus est utile lorsque les parents sont connus. Dans mon scénario, seul le nom de l’object auquel il faut accéder est connu, pas ses parents. Alors, comment puis-je accéder à cet object par son nom, indépendamment de son parent?

Existe-t-il une méthode telle que GetObject (“objName”) ou quelque chose de similaire?

Vous pouvez utiliser la méthode Controls.Find () du formulaire pour récupérer une référence:

  var matches = this.Controls.Find("button2", true); 

Attention, cela retourne un tableau , la propriété Name d’un contrôle peut être ambiguë, aucun mécanisme ne permet de garantir qu’un contrôle a un nom unique. Vous devrez le faire respecter vous-même.

  TextBox txtAmnt = (TextBox)this.Controls.Find("txtAmnt" + (i + 1), false).FirstOrDefault(); 

Cela fonctionne lorsque vous savez ce que vous recherchez.

Si vous êtes dans un contrôle utilisateur et que vous n’avez pas d’access direct au formulaire conteneur, vous pouvez procéder comme suit:

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

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

Voir Méthodes Control.ControlCollection et notez qu’il n’y a pas d’icône de téléphone à côté de la méthode Find.

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

 // Return all controls by name // that are descendents of a specified control. List GetControlByName( Control controlToSearch, ssortingng nameOfControlsToFind, bool searchDescendants) where T : class { List result; result = new List(); foreach (Control c in controlToSearch.Controls) { if (c.Name == nameOfControlsToFind && c.GetType() == typeof(T)) { result.Add(c as T); } if (searchDescendants) { result.AddRange(GetControlByName(c, nameOfControlsToFind, true)); } } return result; } 

Ensuite, utilisez-le comme ceci:

 // find all TextBox controls // that have the name txtMyTextBox // and that are descendents of the current form (this) List targetTextBoxes = GetControlByName(this, "txtMyTextBox", true);