编辑:查看底部的原因是为什么会发生这种情况
我有一个非常奇怪的IndexOutOfRangeException(如标题中所述)。当我使用foreach迭代控件的控件(递归FindControl)时会发生这种情况。
然后我想添加一个确保root.Controls.Count > 0
的额外检查。但是我一直得到异常,而调试器清楚地说Count == 0
。
有问题的根是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之前如何在没有错误的情况下发生这种情况。
答案 0 :(得分:3)
尝试使用Control.HasControls()而不是Controls.Count,可能会解决问题。
答案 1 :(得分:0)
具体问题:foreach如何抛出IndexOutOfRangeException 在本地集合
与foreach无关;访问控件的Controls属性时发生异常。这就是为什么当你尝试获取root.Controls.Count时也会发生这种情况,因为Count是Controls集合的一个属性,因此你试图在询问它的Count之前首先访问该集合。
你需要检查你在哪个控件上调用此函数以及在什么时候调用。也许控件是从损坏的资源加载,或者您正在尝试在正确加载之前访问其控件集合,或类似的东西。很难说没有看到更多的代码。
尝试在普通的香草形式上使用此功能,并确保在正确加载后调用它并查看它是否有效。