【问题标题】:runat="server" div causes System.Web.HttpException when accessed from control collection从控件集合访问时,runat="server" div 导致 System.Web.HttpException
【发布时间】:2012-04-11 15:03:46
【问题描述】:

我有一个 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,我就看不到其中的控件,因此这些控件都不会被清除。具有讽刺意味的是,我发现一个人发了一篇关于完全相同同样事情的帖子,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'}

请假设这必须是一个运行服务器 div,并且不能更改为面板。 (我几乎可以肯定将其更改为面板会解决它,但我们还有其他要求需要它成为 runat 服务器 div(长话短说)。

【问题讨论】:

  • 您发布的代码都没有显示您访问 HtmlGeneticControl 的位置,没有代码它不会很有帮助。
  • @Lloyd 就是这样,我没有从我编写的任何代码中访问任何 HtmlGenericControl。它在上述 foreach 上失败(paneltoclear.Controls 中的控制 c1)。我可以发布的唯一其他内容是 .aspx 页面中的实际 div 本身,
  • 你已经写了“一旦到达 div,我就看不到其中的控件,因此这些控件都不会被清除。”您使用什么代码来清除 div 内的控件?
  • 这个方法,ClearControlsInPanel。 foreach 循环遍历面板中的每个控件,并将其设置为“”、未选中、selectedindex = 0 等。问题是,当它遇到一个 div 控件时,它会抛出该异常,并且 foreach 循环没有得到到 div 中的任何控件。
  • 哇,投反对票?真的?我很想知道为什么。

标签: c# asp.net webforms runatserver controlcollection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您发布访问 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);
                    }
                }
            }
        }
    

    【讨论】:

    • 抱歉,我不太明白,因为从字面上看,我拥有的唯一代码是一个事件处理程序(ddlist 选择已更改),其中唯一的一行是 ClearControlsInPanel(pnlform, new string[ 1] { "ddlallemployees" });该字符串是不相关的 --- 删除它会产生相同的错误。然后,正如我在上面的评论中提到的那样,异常发生在 foreach 循环中,在达到任何 if 之前。
    • 因此,当我更改 ddlist 选择时,事件触发,它执行单行且唯一的代码行 (ClearControlsInPanel()),然后 foreach (Control c1 in paneltoclear.Controls) 导致异常.
    • 你确定你在这里得到了一个真正的执行异常。我已经剪切并粘贴了代码,它运行良好。如果你在 VS 调试器中查看,当调试器尝试调用内部文本属性时,你会看到一个异常,但只要你的代码不调用它就可以了???
    • 程序运行如你所说,但由于调用内部文本属性时出现异常,它看不到该div内的任何控件。它会跳过 div 的全部内容。
    • 就像一些人说你真的需要发布代码......现在看来问题是你只是没有清除子控件......我会在上面发布一些代码...
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签