在 Web 表单中查找控件

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于在 Web 表单中查找控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中访问查找所有控件和所有组件到表单中?

如何在 MS-Access 的表单上显示 Web 浏览器控件中的表格字段内容?

Windows 窗体应用程序的 Web 浏览器控件不处理表单操作中的相对 URL?

VS2010 创建控件时出错 无法显示此控件,因为该控件的TagPrefix未在此WEB表单中注册

如何在 WebBrowser 控件中提交表单?

如何将帐户信息放入 Facebook 登录表单并单击 Web 浏览器控件中的提交按钮?