Pra*_*gus 4 c# asp.net controls
如何在没有ID的情况下引用c#(运行时)中的控件?
例如,我有一个页面,其中包含一个表.我将使用xmlhttp递归加载此页面,因此我无法使用它的id引用该表.有什么效果this.Page.Controls[2]吗?还是Controls["Tables"][0]?
我尝试使用该名称,this.Controls.Find("MyTableName", true);但需要对库的引用System.Windows.Forms(我认为),但不知道如何添加它,因为'using System.'intellisense无法看到它.
我循环了所有的控件,this.Controls但'system.ui.web.control' does not contain a definition for '.Name'所以我只能搜索ID.
我是新手,我相信这些解决方案非常简单.
提前致谢
Rex*_*x M 12
要在页面上查找控件,它必须是服务器控件,如下所示:
<asp:Table runat="server">
...
</asp:Table>
Run Code Online (Sandbox Code Playgroud)
页面上的常规HTML不是"控件",它们只是发送到浏览器的文本.另一方面,服务器控件是可以与代码隐藏交互的实际.NET类.
您仍然可以通过搜索其容器的Controls集合或通过递归搜索页面来获取此控件的句柄而无需其ID.让我们从递归搜索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;
}
Run Code Online (Sandbox Code Playgroud)
(超出了这个答案的范围,这是一个更好的扩展方法).
要通过ID以外的其他内容查找控件,可以按类型搜索:
if(someControl is System.Web.UI.WebControls.Table)
Run Code Online (Sandbox Code Playgroud)
请注意,这通常不是一个好主意.如果您最终必须以这种方式搜索控件,那么这不是一个很棒的模式 - 您应该为控件提供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;
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用此方法的通用形式:
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;
}
Run Code Online (Sandbox Code Playgroud)
您绝对不希望包含System.Windows.Forms,因为它只包含WinForms应用程序的所有代码.这就是为什么Visual Studio没有在Web项目中为您提供它 - 您永远不需要它.System.Web.UI具有Web控件的所有功能.