2009-10-14 5 views
4

Comment cibler un contrôle par son type?Comment accéder à un contrôle dans une collection par son type?

J'ai une collection de contrôle "TargetControls"

 List<Control> TargetControls = new List<Control>(); 
     foreach (Control page in Tabs.TabPages) 
     { 
      foreach (Control SubControl in page.Controls) 

       TargetControls.Add(SubControl); 
     } 

     foreach (Control ctrl in TargetControls)... 

J'ai besoin pour accéder à chaque contrôle existant (combobox, case à cocher, etc.) Par son type spécifique avec l'accès à ses propriétés spécifiques. La façon dont je le fais maintenant ne me donne accès qu'aux propriétés de contrôle génériques.

Je ne peux pas préciser quelque chose comme ...

Combobox courant = new ComboBox [ "nom"]; /// Référencement d'une instance de ComboBox 'Nom'

puis d'avoir accès à ses propriétés (déjà existantes) pour la manipulation?

Répondre

1

Vous devez convertir le contrôle au bon type de contrôle avant d'accéder à des paramètres spécifiques.

ComboBox c = ctrl as ComboBox; 
If (c != null) 
{ 
    //do some combo box specific stuff here 
} 

Vous pouvez également ajouter les contrôles à un dictionary<string, control> générique et utiliser la control.name comme la clé là.

Ex.

Dictionary<string, Control> TargetControls = new Dictionary<string, Control>(); 
+0

Merci, c'est exactement ce dont j'ai besoin. ComboBox c = ctrl comme ComboBox; Je comprends maintenant et j'ai implémenté le casting. Toutes les solutions semblent cool mais c'est ce qui harmonise le mieux avec mon code. – zion

0

Afin d'accéder aux propriétés spécifiques d'un contrôle, vous devez le convertir en son type approprié. Par exemple, si l'élément de votre collection TargetControls était une zone de texte, vous devez indiquer ((TextBox)TargetControls[0]).Text = 'blah';

Si vous ne connaissez pas les types à l'avance, vous pouvez utiliser la réflexion pour accéder aux propriétés, mais j'aurais besoin Pour avoir un meilleur exemple de ce que vous essayez de faire en premier ...

6

Vous pouvez utiliser le mot-clé est pour vérifier un type spécifique du contrôle. Si le contrôle est d'un type spécifique, faites un typecast.

foreach (Control SubControl in page.Controls) 
{ 
    if (SubControl is TextBox) 
    { 
     TextBox ctl = SubControl as TextBox; 
    } 
} 
+0

+1 ne laissez personne vous a frappé avec un non-sens sur la façon dont vous devez utiliser '' as' au lieu de is' et vérifiez ' null'. – MusiGenesis

+0

je ne le ferai pas :) – Amirshk

1

En supposant que vous pouvez utiliser LINQ, et vous êtes à la recherche (par exemple) un contrôle Button:

var button = (from Control c in TargetControls 
       where c.Name == "myName" && c is Button 
       select c 
      ).FirstOrDefault(); 

... qui vous donnera le premier contrôle Button nommé "myName" dans votre collection, ou null si ces éléments ne sont pas présents.

1

Qu'en est-il de la méthode Find?

Button btn = (Button)this.Controls.Find("button1", true)[0]; 
      btn.Text = "New Text"; 
2

Vous pouvez utiliser la méthode d'extension OfType<T>:

foreach (var textBox = page.Controls.OfType<TextBox>()) { 
    // ... 
} 
Questions connexes