如何在没有 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' 不包含 '.Name' 的定义
所以我可以只搜索 ID。
我是新手,我相信解决方案非常简单。
提前致谢
最佳答案
要在您的页面上找到一个控件,它必须是一个服务器控件,如下所示:
<asp:Table runat="server">
...
</asp:Table>
页面上的常规 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;
}
(超出此答案的范围,最好将其作为 extension method 完成)。
要通过 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;
}
您还可以使用此方法的通用形式:
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 控件的一切。
关于c# 查找控件和控件引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1224447/