C# 如何检索嵌套在其他控件中的多个控件

C# 如何检索嵌套在其他控件中的多个控件,c#,asp.net,user-controls,C#,Asp.net,User Controls,这基本上就是我想做的 假设我的default.aspx页面有6个面板 <asp:Panel runat="server" ID="1"> <asp:Panel runat="server" ID="2"> <asp:Panel runat="server" ID="3"> <asp:Panel runat="server" ID="4"> <asp:Panel runat="server" ID="5"> <asp:Panel r

这基本上就是我想做的

假设我的default.aspx页面有6个面板

<asp:Panel runat="server" ID="1">
<asp:Panel runat="server" ID="2">
<asp:Panel runat="server" ID="3">
<asp:Panel runat="server" ID="4">
<asp:Panel runat="server" ID="5">
<asp:Panel runat="server" ID="6">

然后我有一个简单的void,它接受ID的字符串参数

例如,我传入ID 3,我想禁用除panel ID=“3”之外的所有面板

我尝试了以下操作,但找不到任何面板控件

    foreach (Panel pnl in this.Page.Controls.OfType<Panel>())
    {
        if (pnl.ID.ToUpper() == texthi.ToUpper().Replace(" ", ""))
        {
            pnl.Visible = true;
        }
        else
        {
            pnl.Visible = false;
        }

    }
foreach(此.Page.Controls.OfType()中的面板pnl)
{
如果(pnl.ID.ToUpper()==texthi.ToUpper().Replace(“,”))
{
pnl.Visible=true;
}
其他的
{
pnl.Visible=false;
}
}

这将找不到嵌套控件。如果这些控件不是页面的子控件,则不会找到它们。要解决此问题,请查找这些面板的父控件。对于in stance,如果父级为“form1”,则这是工作代码:

     protected void Page_Load(object sender, EventArgs e)
    {
        string texthi = "3";

        // FIND THE PARENT

        Control form1 = Page.FindControl("form1");

        foreach (Panel pnl in form1.Controls.OfType<Panel>())
        {
            if (pnl.ID.ToUpper() == texthi.ToUpper().Replace(" ", ""))
            {
                pnl.Visible = true;
            }
            else
            {
                pnl.Visible = false;
            }

        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
字符串texthi=“3”;
//找到父对象
控件form1=Page.FindControl(“form1”);
foreach(form1.Controls.OfType()中的面板pnl)
{
如果(pnl.ID.ToUpper()==texthi.ToUpper().Replace(“,”))
{
pnl.Visible=true;
}
其他的
{
pnl.Visible=false;
}
}
}

还有其他方法可以找到这些控件,但这可能是更好的方法之一。

如果面板控件位于其他控件中,您将无法找到它

如果要搜索嵌套在其他控件中的控件,则需要递归搜索

以下是帮助方法-

public static List<T> FindControlsRecursive<T>(Control parent) 
  where T : Control
{
    var foundControls = new List<T>();
    FindControlsRecursive(parent, foundControls);
    return foundControls;
}

public static void FindControlsRecursive<T>(Control parent, List<T> foundControls) 
  where T : Control
{
    foreach (Control control in parent.Controls)
    {
        if (control is T)
            foundControls.Add((T) control);
        else
            FindControlsRecursive(control, foundControls);
    }
}
公共静态列表FindControlsRecursive(控件父级)
其中T:控制
{
var foundControls=新列表();
FindControlsRecursive(父控件、foundControls);
返回控制;
}
公共静态void FindControlsRecursive(控件父级,列表foundControls)
其中T:控制
{
foreach(父控件中的控件)
{
如果(控制为T)
foundControls.Add((T)control);
其他的
FindControlsRecursive(控件,foundControls);
}
}
用法

小组1
小组2
小组3
受保护的无效页面加载(对象发送方、事件参数e)
{
字符串texthi=“Panel1”;
var panelControls=FindControlsRecursive(第页);
foreach(面板控件中的var面板)
{
如果(panel.ID.ToUpper()==texthi.ToUpper().Replace(“,”))
{
panel.Visible=true;
}
其他的
{
面板可见=假;
}
}
}
<asp:PlaceHolder runat="server" ID="PlaceHolder1">
    <asp:Panel runat="server" ID="Panel1">
        Panel 1
    </asp:Panel>
</asp:PlaceHolder>
<asp:PlaceHolder runat="server" ID="PlaceHolder2">
    <asp:Panel runat="server" ID="Panel2">
        Panel 2
    </asp:Panel>
</asp:PlaceHolder>
<asp:Panel runat="server" ID="Panel3">
    Panel 3
</asp:Panel>

protected void Page_Load(object sender, EventArgs e)
{
    string texthi = "Panel1";

    var panelControls = FindControlsRecursive<Panel>(Page);
    foreach (var panel in panelControls)
    {
        if (panel.ID.ToUpper() == texthi.ToUpper().Replace(" ", ""))
        {
            panel.Visible = true;
        }
        else
        {
            panel.Visible = false;
        }
    }
}