【问题标题】:Find a control in a webform在 Web 表单中查找控件
【发布时间】:2010-10-11 18:59:58
【问题描述】:

我有一个 Web 内容表单,需要访问内容面板内的控件。我知道访问控件的两种方法:

  1. TextBox txt = (TextBox)Page.Controls[0].Controls[3].Controls[48].Controls[6]
  2. 通过编写一个搜索所有控件的递归函数。

还有其他更简单的方法吗,因为Page.FindControl 在这种情况下不起作用。 我问的原因是我觉得 Page 对象或 Content Panel 对象应该有一个方法来查找子控件,但找不到类似的东西。

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    问题在于 FindControl() 不会遍历某些子控件,例如模板控件。如果您所追求的控件存在于模板中,则不会找到它。

    所以我们添加了以下扩展方法来处理这个问题。如果您不使用 3.5 或不想使用扩展方法,则可以使用这些方法制作一个通用库。

    您现在可以通过编码获得所需的控制:

    var button = Page.GetControl("MyButton") as Button;
    

    扩展方法为您完成递归工作。希望这会有所帮助!

    public static IEnumerable<Control> Flatten(this ControlCollection controls)
    {
        List<Control> list = new List<Control>();
        controls.Traverse(c => list.Add(c));
        return list;
    }
    
    public static IEnumerable<Control> Flatten(this ControlCollection controls,     
        Func<Control, bool> predicate)
    {
        List<Control> list = new List<Control>();
        controls.Traverse(c => { if (predicate(c)) list.Add(c); });
        return list;
    }
    
    public static void Traverse(this ControlCollection controls, Action<Control> action)
    {
        foreach (Control control in controls)
        {
            action(control);
            if (control.HasControls())
            {
                control.Controls.Traverse(action);
            }
        }
    }
    
    public static Control GetControl(this Control control, string id)
    {
        return control.Controls.Flatten(c => c.ID == id).SingleOrDefault();
    }
    
    public static IEnumerable<Control> GetControls(this Control control)
    {
        return control.Controls.Flatten();
    }
    

    【讨论】:

      【解决方案2】:

      我想将您的 GetControls 函数更改为通用函数,如下所示:

      public static T GetControl<T>(this Control control, string id) where T:Control
      {
          var result = control.Controls.Flatten(c => (c.GetType().IsSubclassOf(typeof(T))) && (c.ID == id)).SingleOrDefault();
          if (result == null)
              return null;
          return result as T;
      }
      

      然后,

      public static Control GetControl(this Control control, string id)
      {
          return control.GetControl<Control>(id);
      }
      

      这样,调用者会调用类似:

      var button = Page.GetControl<Button>("MyButton");
      

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 2013-01-31
        • 2011-09-28
        相关资源
        最近更新 更多