c#查找控件和控件参考

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控件的所有功能.