简体   繁体   English

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

[英]C# - find page control in the page

I has aspx page as below. 我有aspx页面如下。 I want to find the control in the page using code behind. 我想使用后面的代码在页面中找到控件。

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

Code Behind 代码背后

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

I can't get the button in the loop. 我无法在循环中获得按钮。 Even i add textbox it also can't get. 即使我添加文本框也无法获得。 Any one has idea what wrong? 任何人都有什么错误的想法? Please help. 请帮忙。

This is because you're not getting all the controls in your page. 这是因为您没有获得页面中的所有控件。 You'd have to get controls recursively. 你必须递归地获得控件。 Here's an extension method: 这是一个扩展方法:

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

Now you can rewrite your code as follows: 现在您可以按如下方式重写代码:

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

Try This. 尝试这个。

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 renders the page Hierarchically. ASP.Net以层次结构呈现页面。 This means that only top level controls are rendered directly. 这意味着只能直接渲染顶级控件。 If any of these top level control contains some child controls, these top level control provide their own Controls property. 如果这些顶级控件中的任何一个包含一些子控件,则这些顶级控件提供自己的Controls属性。

For example, in your case Form is the top level control that contains child controls such as Button. 例如,在您的情况下,Form是包含子控件(如Button)的顶级控件。 So on your button click call a method recursively. 因此,在您的按钮上单击以递归方式调用方法。

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

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM