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

时间:2015-07-27 06:42:32

标签: c# asp.net asp.net-controls

这可能是一个菜鸟问题,但我无法理解为什么它不起作用。我想在用户输入新记录后清除页面内的所有表单。我在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()获取类型,但它说它在上下文中无效。

1 个答案:

答案 0 :(得分:2)

您必须使用递归函数并将控件作为参数传递给该函数,然后函数将遍历该控件内的控件,请参阅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时,它只会获取你页面上第一级元素的任何服务器控件。

希望这会有所帮助...