要在页面上找到控件,它必须是一个服务器控件,像这样:
<asp:Table runat="server">
...
</asp:Table>
页面上的常规HTML不是“控件”,它们只是发送到浏览器的文本。另一方面,服务器控件是实际的.NET类,可以与代码后台交互。
您仍然可以通过搜索其容器的Controls集合或递归搜索页面来获取此控件的句柄。让我们从递归搜索Controls集合开始:
Controls集合仅指给定控件的直接子控件。或者是页面的直接子控件。这些控件反过来有自己的子控件。它代表了内存中的树形结构。
以下是一种方法,从给定的控件向下递归遍历树,并按ID查找控件:
private Control FindControlRecursive(Control control, string id)
{
Control returnControl = control.FindControl(id);
if (returnControl == null)
{
foreach (Control child in control.Controls)
{
returnControl = child.FindControlRecursive(id);
if (returnControl != null && returnControl.ID == id)
{
return returnControl;
}
}
}
return returnControl;
}
此答案的范围之外,更好的方法是使用扩展方法。
如果要通过除其ID之外的内容查找控件,可以按类型搜索:
if(someControl is System.Web.UI.WebControls.Table)
请注意,这通常不是一个很好的主意。如果你最终需要以这种方式搜索控件,那么这不是一个很好的模式 - 你应该在控件上有一个ID或者你应该已经有对它的引用,因为它是通过代码创建的。
然而,修改该方法以递归搜索类型很容易:
private Control FindTable(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child is System.Web.UI.WebControls.Table)
{
return child;
}
else
{
return FindTable(child);
}
}
return null;
}
您可以使用一种通用形式的此方法:
```html
您也可以使用此方法的通用表单:
```
private Control FindControl<T>(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child.GetType().IsAssignableFrom(typeof(T)))
{
return child;
}
else
{
return FindControl<T>(child);
}
}
return null;
}
您绝对不需要包括System.Windows.Forms,因为那只是包含了WinForms应用程序的所有代码。这就是为什么Visual Studio没有在Web项目中为您包含它-您永远不需要它。System.Web.UI包含了所有Web控件所需的东西。