我有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;
}
}
}
我无法在循环中获得该按钮。即使我添加文本框也无法获得。任何人都有什么错误的想法?请帮忙。
答案 0 :(得分:1)
这是因为您没有获得页面中的所有控件。你必须递归地获得控件。这是一个扩展方法:
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.
}
答案 1 :(得分:1)
试试这个。
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
}
}
答案 2 :(得分:1)
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);
}
}