【发布时间】: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/…您的页面中有动态内容吗?