2009-10-29 3 views
4

Tous,Recherche d'un contrôle dans un TabControl

Je tente de trouver un contrôle par nom dans un TabControl. Cependant ma méthode actuelle ne descend pas aux enfants du contrôle. Quelle est la meilleure façon de le faire

Control control = m_TabControlBasicItems.Controls[controlName]; 

contrôle est alway nulle parce qu'elle est inférieure à deux niveaux (ou trois). TabPage, GroupBox, et parfois Panel dans le cas de radioButtons

Merci!

+0

Merci à tous pour les réponses rapides !!! – Billy

Répondre

3

Vous devez récursif à travers tous les contrôles de trouver la bonne.

Here est un exemple parfait pour vous. Vous devriez pouvoir copier et coller et l'appeler sans mods.

coller le code snippet au cas où le lien meurt:

/// <summary> 
/// Finds a Control recursively. Note finds the first match and exists 
/// </summary> 
/// <param name="container">The container to search for the control passed. Remember 
/// all controls (Panel, GroupBox, Form, etc are all containsers for controls 
/// </param> 
/// <param name="name">Name of the control to look for</param> 
public Control FindControlRecursive(Control container, string name) 
{ 
    if (container == name) return container; 

    foreach (Control ctrl in container.Controls) 
    { 
     Control foundCtrl = FindControlRecursive(ctrl, name); 

     if (foundCtrl != null) return foundCtrl; 
    } 

    return null; 
} 
+0

btw devait changer if (container.ID == name) en if (container.Name == nom) – Billy

+0

Probablement parce que .ID est pour l'identification ASP.NET Web Control; alors que .Name est pour l'identification du contrôle Windows Forms. Deux ensembles de contrôles différents. –

+0

lien mort - changement de pls? – Ash

2

essayer en boucle sur tous les conteneurs dans l'onglet du panneau:

foreach(var c in tab_panel.Controls) 
{ 
    if(c is your control) 
    return c; 

    if(c is a container) 
    loop through all controls in c;//recursion 
} 
3

.NET n'expose pas un moyen de rechercher des contrôles imbriqués. Vous devez implémenter une recherche récursive par vous-même.

Voici un exemple:

public class MyUtility 
    { 
     public static Control FindControl(string id, ControlCollection col) 
     { 
      foreach (Control c in col) 
      { 
       Control child = FindControlRecursive(c, id); 
       if (child != null) 
        return child; 
      } 
      return null; 
     } 

     private static Control FindControlRecursive(Control root, string id) 
     { 
      if (root.ID != null && root.ID == id) 
       return root; 

      foreach (Control c in root.Controls) 
      { 
       Control rc = FindControlRecursive(c, id); 
       if (rc != null) 
        return rc; 
      } 
      return null; 
     } 
    } 
0

mmm, avez-vous envisagé des interfaces au lieu des noms? changez le type de contrôle en une classe dérivée du type actuel du contrôle et implémente une interface qui identifie le contrôle que vous vouliez. Ensuite, vous pouvez parcourir de manière récursive les contrôles enfants de l'onglet pour rechercher les contrôles qui ont implémenté l'interface. De cette façon, vous pouvez changer le nom du contrôle sans casser le code, et obtenir la vérification de la compilation (pas de faute de frappe dans le nom).

1

essayez ceci:

Control FindControl(Control root, string controlName) 
{ 
    foreach (Control c in root.Controls) 
    { 
     if (c.Controls.Count > 0) 
      return FindControl(c); 
     else if (c.Name == controlName) 
      return c;    
    } 
    return null; 
} 
-1

Voir MSDN pour ...

System.Web.UI.Control.FindControl (id string);

Recherche récursive d'un contrôle enfant, d'un contrôle, d'un ID de contrôle.

Fonctionne très bien pour moi.

Questions connexes