如何迭代 asp.net 页面内的控件?

How to iterate over the controls inside an asp.net page?

这可能是一个菜鸟问题,但我不明白为什么它不起作用。我想在用户输入新记录后清除页面内的所有表单。我在 OnClick 方法完成之前调用它。我的页面也没有父 Master page,我只想遍历我想要的 Controls,而不是全部。这是我的代码: (我知道如果我这样使用它会弄乱 DropDownList 项,我会在了解获取页面中的控件的逻辑后更改它)

public void ClearForms()
        {
            foreach (var item in Page.Controls)
            {
                if (item is TextBox)
                {
                    ((TextBox)item).Text = String.Empty;
                }
                if (item is ListItem)
                {
                    ((ListItem)item).Text = "Choose...";
                    ((ListItem)item).Value = "-1";
                }
            }
        }

该程序也不进入 if 语句。我试图通过 item.GetType() 获取类型,但它说它在上下文中无效。

您要么必须使用递归函数并将控件作为参数传递给该函数,然后该函数将循环遍历该控件内的控件,请参阅 Loop through all controls on asp.net webpage

或者您必须将列表框和文本框放在一个面板中,然后循环访问该面板中的控件,如下所示:

<asp:Panel ID="pnl" runat="server">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</asp:Panel>

<asp:Button ID="btnClear" runat="server" Text="Clear" OnClick="btnClear_Click" />

以及后面的代码:

protected void btnClear_Click(object sender, EventArgs e)
    {
        ClearForms(pnl);
    }

    public void ClearForms(Control c)
    {
        foreach (var item in c.Controls)
        {
            if (item is TextBox)
            {
                ((TextBox)item).Text = String.Empty;
            }
            if (item is ListItem)
            {
                ((ListItem)item).Text = "Choose...";
                ((ListItem)item).Value = "-1";
            }
        }
    }

对你的情况的解释:control.Controls 只获取控件内的第一级控件,所以当你调用 Page.Controls 时,它只获取页面第一级上的任何服务器控件元素。

希望这对您有所帮助...