使用foreach的IndexOutOfRangeException

时间:2013-01-18 10:06:07

标签: c# asp.net exception

编辑:查看底部的原因是为什么会发生这种情况

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

strange error 1

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

strange error 2

有问题的根是FormView。如果有人有任何想法为什么简单的属性检查抛出IndexOutOfRangeException,请赐教!

异常stackTrace(是的,它完成):

   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(即使用该数据源)。我仍然有兴趣知道在访问childcontrols之前如何在没有错误的情况下发生这种情况。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

  

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

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

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

尝试在普通的香草形式上使用此功能,并确保在正确加载后调用它并查看它是否有效。