2010-10-14 126 views
5

我解析了一个Repeater项目控件的客户端ID,并且我想在其他命令中使用它, 我怎么不能通过他的客户端ID获取控件?通过客户端ID获取控制

TextBox TB = FindControl ...?

回答

7

您是否试图找到驻留在中继器内的文本框?如果是这样,您可以使用下面的方法根据控件的ID进行搜索 - 您可以修改它以基于控件的clientID进行检查。

public static System.Web.UI.Control FindControlIterative(System.Web.UI.Control root, string id) 
    { 
     System.Web.UI.Control ctl = root; 
     var ctls = new LinkedList<System.Web.UI.Control>(); 

     while (ctl != null) 
     { 
      if (ctl.ID == id) 
       return ctl; 
      foreach (System.Web.UI.Control child in ctl.Controls) 
      { 
       if (child.ID == id) 
        return child; 
       if (child.HasControls()) 
        ctls.AddLast(child); 
      } 
      if (ctls.First != null) 
      { 
       ctl = ctls.First.Value; 
       ctls.Remove(ctl); 
      } 
      else return null; 
     } 
     return null; 
    } 
+1

非常感谢!它对我非常有帮助。 – 2013-11-11 14:11:07

0
<%= Control.ClientID %> 
0

你可以访问特定的RepeaterItem(就像您在ItemDataBound事件处理程序)?

如果是这样,你可以做repeaterItem.FindControl("YourControlId")来获得子控件。

0
public static System.Web.UI.Control GetControlIterativeClientID(System.Web.UI.Control root, string id) 
    { 
     System.Web.UI.Control ctl = root; 
     var ctls = new LinkedList<System.Web.UI.Control>(); 
     if (root != null) 
     { 
      if (ctl.ID == id) 
       return ctl; 
      foreach (System.Web.UI.Control child in ctl.Controls) 
      { 
       if (child.ID == id) 
        return child; 
       if (child.HasControls()) 
        GetControlIterativeClientID(child, id);       
      }     
     } 
     return null; 
    } 
0

而是循环的所有控件整个控件树,你可以把它分解,并从集团转到上一级控制当时的:

public Control GetControlByClientId(string clientId) 
{ 
    Queue<string> clientIds = new Queue<string>(clientId.Split(ClientIDSeparator)); 
    Control root = this.Page; 
    string subControlId = null; 
    while (clientIds.Count > 0) 
    { 
     if (subControlId == null) 
     { 
      subControlId = clientIds.Dequeue(); 
     } 
     else 
     { 
      subControlId += ClientIDSeparator + clientIds.Dequeue(); 
     } 
     Control subControl = root.FindControl(subControlId); 
     if (subControl != null) 
     { 
      root = subControl; 
      subControlId = null; 
     } 
    } 
    if (root.ClientID == clientId) 
    { 
     return root; 
    } 
    else 
    { 
     throw new ArgumentOutOfRangeException(); 
    } 
} 

注:此功能使用ClientIDSeparator其受保护的属性这是在Control类中定义的,所以此方法必须用于继承Control的某些内容。

0

最短的代码是在这里:

private Control getControl(Control root, string pClientID) 
{ 
    if (root.ClientID == pClientID) 
     return root; 
    foreach (Control c in root.Controls) 
     using (Control subc= getControl(c, pClientID)) 
      if (subc != null) 
       return subc; 
    return null; 
} 
相关问题