使用FindControl(“”)的简便方法

时间:2010-02-05 16:45:39

标签: c# asp.net

C#

您好,

我已经开发了几年的c#web应用程序,并且有一个问题我不断发现我无法找到合理的解决方法。

我有一个控件我希望在后面的代码中访问,这个控件在标记的深处;在ContentPlaceHolders,UpdatePanels,Panels,GridViews,EmptyDataTemplates,TableCells(或者你喜欢的任何结构)中埋葬......重点是它拥有更多的父母而不是更多的父母。

如何在不执行此操作的情况下使用FindControl("")来访问此控件:

Page.Form.Controls[1].Controls[1].Controls[4].Controls[1].Controls[13].Controls[1].Controls[0].Controls[0].Controls[4].FindControl("");

3 个答案:

答案 0 :(得分:12)

编写一个名为FindControlRecursive的辅助方法,由Jeff Atwood自己提供。

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id)
    { 
        return root; 
    } 

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

    return null; 
} 

Recursive Page.FindControl

答案 1 :(得分:3)

使用Recursive FindControl:

public T FindControl<T>(string id) where T : Control
   {
       return FindControl<T>(Page, id);
   }

   public static T FindControl<T>(Control startingControl, string id) where T : Control
   {
       // this is null by default
       T found = default(T);

      int controlCount = startingControl.Controls.Count;

      if (controlCount > 0)
      {
          for (int i = 0; i < controlCount; i++)
          {
              Control activeControl = startingControl.Controls[i];
              if (activeControl is T)
              {
                 found = startingControl.Controls[i] as T;
                  if (string.Compare(id, found.ID, true) == 0) break;
                  else found = null;
              }
              else
              {
                  found = FindControl<T>(activeControl, id);
                  if (found != null) break;
              }
          }
      }
      return found;
  }  

答案 2 :(得分:0)

或者在LINQ中:

        private Control FindControlRecursive(Control root, string id)
        {
            return root.ID == id
                       ? root
                       : (root.Controls.Cast<Control>()
                             .Select(c => FindControlRecursive(c, id)))
                             .FirstOrDefault(t => t != null);
        }