C#-在页面中查找页面控件

本文关键字:控件 查找 C#- | 更新日期: 2023-09-27 18:27:06

我有一个aspx页面,如下所示。我想使用代码隐藏在页面中找到控件。

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
<body>
    <form id="form1" runat="server">
      <div>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
      </div>
   </form>
 </body>
</html>

背后的代码

protected void Button1_Click(object sender, EventArgs e)
    {
        string name;
        foreach (Control ctrl in Controls)
        {
            if (ctrl.Controls.Count > 0)
            {
                name = ctrl.GetType().Name;
            }
        }
    }

我打不开这个按钮。即使我添加了文本框,它也无法获得。有人知道怎么了?请帮忙。

C#-在页面中查找页面控件

试试这个。

protected void Button1_Click(object sender, EventArgs e)
{
    string Name = "";
    string Type = "";
    string Id = "";
    foreach (Control ctr in form1.Controls)
    {
        Name = ctr.GetType().Name;
        Type = ctr.GetType().ToString(); ;
        Id = ctr.ID; // If its server control
    }
}

ASP.Net按层次结构呈现页面。这意味着只有顶级控件才能直接渲染。如果这些顶级控件中的任何一个包含一些子控件,则这些顶级控件将提供自己的Controls属性。

例如,在您的案例中,Form是包含子控件(如Button)的顶级控件。所以在你的按钮上点击递归调用一个方法。

protected void Button1_Click(object sender, EventArgs e)
    {
        DisplayControl(Page.Controls);
     }
    private void DisplayControls(ControlCollection controls)
    {
        foreach (Control ctrl in controls)
        {
            Response.Write(ctrl.GetType().ToString() + "  , ID::" +  ctrl.ID + "<br />");
           // check for child OR better to say nested controls
            if (ctrl.Controls != null)
                DisplayControls(ctrl.Controls);
        }
    }

这是因为您没有获得页面中的所有控件。你必须递归地获取控件。这里有一个扩展方法:

public static class ControlExtensions
{
    public static List<Control> GetChildrenRecursive(this Control control)
    {
        var result = new List<Control>();
        foreach (Control childControl in control.Controls)
        {
            result.Add(childControl);
            if (childControl.Controls.Count > 0)
            {
                result.AddRange(GetChildrenRecursive(childControl));
            }
        }
        return result;
    }
}   

现在您可以按如下方式重写代码:

foreach (Control ctrl in this.Page.GetChildrenRecursive())
{
    // Your button element is accessible now.
}