-1

我有一个 div 是 runat="server"。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 后,我看不到其中的控件,因此这些控件都不会被清除。具有讽刺意味的是,我发现一个人发表了关于完全相同的事情的帖子,为什么将 runat=server 添加到 div 标记会在控件集合中引发类型为 'System.Web.HttpException 的异常? 但是线程结束了,没有真正的解决方案或解释。

完整的例外是:

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(长话短说))。

4

2 回答 2

1

无论如何,面板都会呈现为 div,那么为什么要使用 div 呢?我认为不需要它,它很快解决了这个问题:)

于 2012-03-28T04:09:53.497 回答
0

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

因此,要清除子集合,请尝试类似...如果您执行 else if vs if

    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);
                }
            }
        }
    }
于 2012-03-28T07:38:22.907 回答