получить контроль по clientID - PullRequest
6 голосов
/ 14 октября 2010

Я разрешаю идентификатор клиента элемента управления Repeater Item и хочу использовать его в другой команде. Как я могу получить элемент управления по его идентификатору клиента?

TextBox TB = FindControl ...?

Ответы [ 6 ]

7 голосов
/ 14 октября 2010

Вы пытаетесь найти текстовое поле внутри ретранслятора?Если это так, вы можете использовать метод, описанный ниже, который выполняет поиск на основе идентификатора элемента управления. Вместо этого вы можете изменить его для проверки на основе 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;
    }
0 голосов
/ 30 марта 2016

Самый короткий код здесь:

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;
}
0 голосов
/ 12 марта 2015

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

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 голосов
/ 17 марта 2014
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 голосов
/ 14 октября 2010

Есть ли у вас доступ к определенному RepeaterItem (как у вас в обработчике события ItemDataBound)?

Если это так, вы можете сделать repeaterItem.FindControl("YourControlId"), чтобы получить дочерний элемент управления.

0 голосов
/ 14 октября 2010
<%= Control.ClientID %>
...