5

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

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

奇怪的错误1

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

奇怪的错误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。


编辑2:

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

4

2 回答 2

3

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

于 2013-01-18T10:53:25.603 回答
0

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

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

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

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

于 2013-01-18T12:13:22.503 回答