【问题标题】:get control by clientID通过clientID获得控制权
【发布时间】:2011-04-25 10:45:03
【问题描述】:

我解析了Repeater Item控件的客户端ID,我想在其他命令中使用它, 我怎么不能通过他的客户 ID 获得控制权?

TextBox TB = FindControl...?

【问题讨论】:

    标签: c# controls repeater clientid


    【解决方案1】:

    最短的代码在这里:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      您可以将其拆分并从组中向上移动一个控件,而不是循环整个控件树中的所有控件:

      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 的内容。

      【讨论】:

        【解决方案3】:
        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;
            }
        

        【讨论】:

          【解决方案4】:

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

          如果是这样,您可以通过repeaterItem.FindControl("YourControlId") 获取子控件。

          【讨论】:

            【解决方案5】:

            您是否要查找驻留在中继器内的文本框?如果是这样,您可以使用下面的方法,该方法基于控件的 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;
                }
            

            【讨论】:

            • 非常感谢!它对我帮助很大。
            【解决方案6】:
            <%= Control.ClientID %>
            

            【讨论】:

              猜你喜欢
              • 2012-02-02
              • 2011-07-25
              • 2016-02-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多