2009-10-29 5 views
4

Все,Поиск элемента управления в TabControl

Я пытаюсь найти элемент управления по имени в TabControl. Однако мой текущий метод не падает до детей элемента управления. Что такое лучший способ сделать это управление

Control control = m_TabControlBasicItems.Controls[controlName]; 

является нулевым, так как все дни это два (или три) уровней ниже. TabPage, GroupBox, а иногда и Panel в случае radioButtons

Спасибо!

+0

Спасибо всем за быстрые ответы !!! – Billy

ответ

3

Вы должны рекурсию через все элементы управления, чтобы найти правильный.

Here - прекрасный пример для вас. Вы должны иметь возможность копировать и вставлять и называть его без модов.

Оклейка фрагмент кода в случае ссылка умирает:

/// <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 пришлось изменить if (container.ID == name) на if (container.Name == name) – Billy

+0

Вероятно, потому что .ID предназначен для идентификации веб-управления ASP.NET; тогда как .Name для идентификации Windows Forms Control. Два разных набора элементов управления. –

+0

мертвая ссылка - замена PLS? – Ash

2

попробовать цикл по всем контейнерам в закладке панели:

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 не предоставляет способ для поиска вложенных элементов управления. Вы должны выполнить рекурсивный поиск самостоятельно.

Вот пример:

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

ттт, вы рассматривали интерфейсы вместо имен? измените тип элемента управления на класс, который получен из текущего типа элемента управления и реализует интерфейс, который идентифицирует требуемый элемент управления. Затем вы можете циклически перемещать дочерние элементы управления вкладкой, чтобы искать элементы управления, которые реализовали интерфейс. Таким образом, вы можете изменить имя элемента управления, не нарушая код, и получить проверку времени компиляции (нет ошибки опечатки в имени).

1

попробовать это:

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

См MSDN для ...

System.Web.UI.Control.FindControl (строка идентификатора);

Рекурсивный поиск дочернего элемента управления элемента управления с помощью идентификатора элемента управления.

Отлично подходит для меня.

Смежные вопросы