C# 在Web窗体中查找控件

C# 在Web窗体中查找控件,c#,asp.net,webforms,C#,Asp.net,Webforms,我有一个Web内容表单,需要访问内容面板内的控件。我知道访问控件的两种方法: TextBox txt=(TextBox)页。控件[0]。控件[3]。控件[48]。控件[6] 通过编写一个递归函数来搜索所有控件 有没有其他更简单的方法,因为Page.FindControl在这种情况下不起作用。 我询问的原因是,我觉得页面对象或内容面板对象应该有一个查找子控件的方法,但找不到任何类似的方法。问题是FindControl()不会遍历某些控件子控件,例如模板控件。如果要查找的控件存在于模板中,则找不到它

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

  • TextBox txt=(TextBox)页。控件[0]。控件[3]。控件[48]。控件[6]
  • 通过编写一个递归函数来搜索所有控件
  • 有没有其他更简单的方法,因为
    Page.FindControl
    在这种情况下不起作用。
    我询问的原因是,我觉得页面对象或内容面板对象应该有一个查找子控件的方法,但找不到任何类似的方法。

    问题是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();
    }
    
    公共静态IEnumerable展平(此控件集合控件)
    {
    列表=新列表();
    遍历(c=>list.Add(c));
    退货清单;
    }
    公共静态IEnumerable展平(此控件集合控件,
    Func谓词)
    {
    列表=新列表();
    遍历(c=>{if(谓词(c))list.Add(c);});
    退货清单;
    }
    公共静态无效遍历(此控件集合控件、操作)
    {
    foreach(控件中的控件)
    {
    行动(控制);
    if(control.HasControls())
    {
    控件。控件。遍历(操作);
    }
    }
    }
    公共静态控件GetControl(此控件,字符串id)
    {
    return control.Controls.flatte(c=>c.ID==ID.SingleOrDefault();
    }
    公共静态IEnumerable GetControls(此控件)
    {
    返回控件.Controls.flatte();
    }
    
    我想将您的
    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;
    }
    
    publicstatict GetControl(此控件,字符串id),其中T:Control
    {
    var result=control.Controls.flatte(c=>(c.GetType().IsSubclassOf(typeof(T))&&(c.ID==ID)).SingleOrDefault();
    如果(结果==null)
    返回null;
    将结果返回为T;
    }
    
    然后呢,

    public static Control GetControl(this Control control, string id)
    {
        return control.GetControl<Control>(id);
    }
    
    公共静态控件GetControl(此控件,字符串id)
    {
    返回控件.GetControl(id);
    }
    
    这样,调用方将调用类似以下内容:

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