从控件集合访问时,runat =“server”div会导致System.Web.HttpException

时间:2012-03-28 02:38:34

标签: c# asp.net webforms runatserver controlcollection

我有一个runat =“server”的div。 div包含在一个面板中,div中有一些控件。当我运行“ClearControlsInPanel()”方法时,div之外的所有控件(但在面板内)都会被清除,如下所示:

public static void ClearControlsInPanel(Panel paneltoclear, string[] ignorelist)
{
    foreach (Control c1 in paneltoclear.Controls)
    {
        if (c1 is TextBox)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((TextBox)c1).Text = "";
            }
        }
        if (c1 is DropDownList)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((DropDownList)c1).SelectedIndex = 0;
            }
        }
        //etc.
    }
}

一旦达到div,我就看不到其中的控件,因此这些控件都不会被清除。具有讽刺意味的是,我找到了一个关于完全相同的帖子的帖子,Why adding runat=server to a div tag throws an exception of type 'System.Web.HttpException in controls collection?但线程结束了,没有真正的解决方案或解释。

完整的例外是:

base {System.Web.UI.HtmlControls.HtmlContainerControl} = {InnerText = 
'((System.Web.UI.HtmlControls.HtmlContainerControl)
(((System.Web.UI.HtmlControls.HtmlGenericControl)(paneltoclear.Controls._controls
[165])))).InnerText' threw an exception of type 'System.Web.HttpException'}

请假设这必须保留为runat服务器div,并且不能更改为面板。 (我几乎可以肯定将它更改为面板会解决它,但我们有其他要求需要这个才能成为一个runat服务器div(长篇故事))。

2 个答案:

答案 0 :(得分:1)

无论如何,面板被渲染成div,为什么div?我认为没有要求,它很快就解决了这个问题:)

答案 1 :(得分:0)

如果您发布访问div的实际代码,则更容易。即if语句的哪个分支实际处理通用控制案例。 我猜测问题是你正在尝试设置div的innertext属性(如异常所示)。 诀窍可能是如果div控件有子节点,那么innertext属性不存在,并且任何文本在div控件的controls数组中表示为文字?

所以要清除儿童收藏品尝试类似...... 如果你做其他事情,如果

,那么也会更好
    public static void ClearControlsInPanel(ControlCollection controls, string[] ignorelist)
    {
        foreach (Control c1 in controls)
        {
            if (c1 is TextBox)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((TextBox)c1).Text = "";
                }
            }
            else if (c1 is DropDownList)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((DropDownList)c1).SelectedIndex = 0;
                }
            }
            else
            {
                if (c1.HasControls())
                {
                    ClearControlsInPanel(c1.Controls, ignorelist);
                }
            }
        }
    }