我有一个正在构建的用户控件(ASP.NET 3.5,使用 C#)。
此控件主要基于另一个类似的控件(不幸的是,剪切和粘贴继承,但没有简单的方法来抽象它)。给我带来麻烦的行是直接从另一个控件复制的,大部分显示也是如此。
相关代码行如下:
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?
- - - - - - - - -编辑 - - - - - - - -
我还应该提到,如果我在即时窗口中运行三个有问题的行中的任何一行,我都会得到正确的结果。当我在调试时检查它时,ControlCollection
我还可以看到其中的控件。pnlForm
-----------------第二次编辑-----------------
为了确认,我添加了另一行: DropDownList notThere = (DropDownList)pnlForm.FindControl("notHere"); 该控件notHere
不在页面上的任何位置。上面的行编译(当然),当我运行调试器时,它运行良好。演员阵容很好。该变量notThere
只是为空。
此问题的根本原因是 NOT FindControl 未能找到控件并尝试将 null 强制转换为 DropDownList 或其他控件