【问题标题】:IndexOutOfRangeException with foreach带有 foreach 的 IndexOutOfRangeException
【发布时间】:2013-01-18 10:06:07
【问题描述】:

编辑:看看底部为什么会发生这种情况

我有一个非常奇怪的 IndexOutOfRangeException(如标题中所述)。当我使用 foreach 遍历控件的控件(递归 FindControl)时会发生这种情况。

然后我想添加一个额外的检查来确保root.Controls.Count > 0。但是我不断收到异常,而调试器清楚地显示Count == 0

有问题的根是 FormView。如果有人知道为什么简单的属性检查会引发 IndexOutOfRangeException,请赐教!

异常堆栈跟踪(是的,它是完整的):

   at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)

代码:

public static Control FindControlRecursive(this Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    if (root.Controls.Count > 0)
    {
        foreach (Control c in root.Controls)
        {
            Control t = c.FindControlRecursive(id);
            if (t != null)
            {
                return t;
            }
        }
    }

    return null;
}

编辑:

我尝试使用原生 FindControl 函数,这会引发相同的错误。


具体问题:

foreach 如何在原生集合上抛出 IndexOutOfRangeException。


EDIT2:

这似乎与使用 ObjectDataSource 有关,我没有正确填写输入参数,但我没有收到任何错误。也许这以某种方式破坏了 FormView(使用该数据源)。我仍然很想知道如何在访问子控件之前不抛出错误的情况下发生这种情况。

【问题讨论】:

  • 如果你知道NamingContainer而不是递归方法,最好使用Control.FindControl,因为:1.它更快2.它更易读3.它更不容易出错:控件的ID 只需要在它的 NamingContainer 中是唯一的,因此您可能会使用递归方法获得错误的控件(考虑带有行的 GridView 和 TemplateField 中的控件) 4. 您了解更多 ASP.NET 页面的工作原理和控件已链接
  • @TimSchmelter 我已添加 Control.FindControl 引发相同的错误。我还使用了几个需要搜索的服务器控件和用户控件。
  • 那么FormView1.FindControl("xy")也抛出异常?
  • @TimSchmelter 它在fvDetail.FindControl("ddlSoortRekening") as DropDownList; yes 上抛出错误。
  • 顺便说一下,Control.Controls 属性不仅仅是一个吸气剂。它还会重新加载所有子控件的ViewState。这可能会导致您的问题。您可能想看看我对相关问题的回答:stackoverflow.com/questions/5276573/…您的页面中有动态内容吗?

标签: c# asp.net exception


【解决方案1】:

而不是 Controls.Count,尝试使用 Control.HasControls(),可能会解决此问题。

【讨论】:

  • 如果没有人解释错误的参数如何在完全不相关的代码中引发错误,我稍后会将其标记为答案,因为它允许我找到实际的错误。
  • 我唯一想到的是标签/文本框没有任何子控件,而 .net 根本无法优雅地处理它。它是否适用于某些控件,如果可以,您可以检查它失败的特定控件类型吗?
  • 它之前几乎适用于任何控件,但在这种情况下它作为带有数据绑定的表单视图失败了,并且数据源的输入参数无效。
【解决方案2】:

具体问题:foreach 如何抛出 IndexOutOfRangeException 在本地集合上

与foreach无关;异常只是在访问控件的 Controls 属性时发生。这就是为什么当您尝试获取 root.Controls.Count 时也会发生这种情况,因为 Count 是 Controls 集合的属性,因此您尝试先访问该集合,然后再询问它的 Count。

您需要检查您在哪个控件上调用此函数以及在什么时间调用。也许控件是从损坏的资源加载的,或者您试图在它正确加载之前访问它的控件集合,或者类似的东西。很难说没有看到更多的代码。

尝试在普通表单上使用此函数,并确保在正确加载后调用它并查看它是否有效。

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2015-06-16
    • 2012-04-23
    相关资源
    最近更新 更多