6

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

文本框 TB = FindControl...?

4

6 回答 6

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;
    }
于 2010-10-14T14:23:00.830 回答
0
<%= Control.ClientID %>
于 2010-10-14T14:22:20.257 回答
0

您是否有权访问特定的 RepeaterItem(就像在 ItemDataBound 事件处理程序中一样)?

如果是这样,你可以做得到repeaterItem.FindControl("YourControlId")孩子控制。

于 2010-10-14T14:26:17.937 回答
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;
    }
于 2014-03-17T11:53:22.830 回答
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 的东西中使用此方法。

于 2015-03-12T15:15:42.547 回答
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;
}
于 2016-03-30T13:16:00.920 回答