我正在构建一个用户控件(使用C#的ASP.NET 3.5)。
这个控件在很大程度上基于另一个类似的控件(剪切和粘贴继承,不幸的是,没有简单的方法来抽象这个)。导致我困扰的行直接从另一个控件复制,显示的大部分也是如此。
相关的代码行如下:
Panel pnlForm = (Panel)e.Item.FindControl("pnlForm");
Literal ltrAvailableCount = (Literal)e.Item.FindControl("ltrAvailableCount");
DropDownList drpLanguage = (DropDownList)pnlForm.FindControl("drpLanguage");
DropDownList drpShipTo = (DropDownList)pnlForm.FindControl("drpShipTo");
HiddenField hdnAvailableProductId = (HiddenField)pnlForm.FindControl("hdnAvailableProductId");
DropDownList drpQuantity = (DropDownList)pnlForm.FindControl("drpQuantity");
HiddenField hdnSelectedStyle = (HiddenField)e.Item.FindControl("hdnSelectedStyle");
Label lblStyleName = (Label)e.Item.FindControl("lblSelectedStyle");
在上面的代码中,
pnlForm
被正确地找到了,ltrAvailableCount
也是。如果我跳到drpQuantity
,它和后面的行都可以正常工作。然而,当我运行drpLanguage
、drpShipTo
或hdnAvailableProductId
的行时,FindControl
会抛出一个NullReferenceException
。我的意思不是它返回了'null',然后我尝试访问返回对象的属性,而是
FindControl
方法抛出了异常。根据MSDN库的说法,这是不可能的——FindControl
没有列出任何潜在的错误,它只是说如果找不到控件,它就返回null。是什么原因导致
FindControl
会出现NullReferenceException呢?-----------------编辑---------------
我还应该提到,如果我在立即窗口中运行任何三个有问题的行,我会得到正确的结果。当我调试时检查
pnlForm
的ControlCollection
时,我也可以看到控件。-----------------第二次编辑-------------------
为了确认,我添加了另一行: DropDownList notThere = (DropDownList)pnlForm.FindControl("notHere"); 控件
notHere
在页面上不存在。上述行编译通过(当然),当我运行调试器时,它可以正常运行。类型转换也没有问题。变量notThere
只是null。这个问题的根本原因并不是FindControl无法找到控件并尝试将null转换为DropDownList或其他控件。