我正在建立一个用户控件(使用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?- - - - - - - - -编辑 - - - - - - - -
我还要提到的是,如果我在立即窗口中运行三个有问题的行中的任何一个,都将得到正确的结果。在调试时检查
ControlCollection
的pnlForm
中的控件时,也可以看到它们。-----------------第二次编辑-------------------
为了确认,我添加了另一行:
DropDownList notThere =(DropDownList)pnlForm.FindControl(“ notHere”);
控件
notHere
不在页面上的任何地方。上面的行会编译(当然),并且当我运行调试器时,它运行良好。演员进行得很好。变量notThere
仅为null。此问题的根本原因是不是FindControl无法找到控件并尝试将null转换为DropDownList或其他控件
最佳答案
不是导致问题的FindControl。
编码的方式是在一行上执行两项操作-FindControl(),然后强制转换为控件数据类型。轰炸是因为强制转换,因为FindControl调用的结果为空值,并且您试图将null强制转换为控件。
这一次让我很痛苦,所以我学会了将其编码为
object oDropDown1 = pnlForm.FindControl("DropDown1");
// then check if oDrowpDown 1 is null and cast if it's safe.
if(oDropDown1 != null)
{
// here it's safe to cast.
}
关于c# - 什么会导致FindControl()抛出NullReferenceException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4829450/