c# 查找控件和控件引用

标签 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' 不包含 '.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/

相关文章:

c# - 具有多线程的 OracleBulkCopy

C#用 Elasticsearch 计算地理距离(nest 2)

c# - 简单注入(inject)器 : End-to-end testing of controller's methods on a test database

c# readonly DataGridView 与一个启用的单元格

c# - WPF中分段进度条的一些快速简单的实现是什么?

c# - 尝试在 C# 中序列化和反序列化实体对象

c# - 带参数类型的转换

java - 如果在网络服务器上运行,rand(时间戳)如何工作?

c# - 将 ASP.NET 应用程序部署到 Web 服务器所需的最少文件

javascript - 使用 JavaScript 获取数组中表单的所有控件?