Jef*_*eff 2 .net c# asp.net findcontrol nullreferenceexception
我有一个用户控件我正在构建(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");
Run Code Online (Sandbox Code Playgroud)
pnlForm
在上面找到了正确的,原样ltrAvailableCount
.
如果我跳过drpQuantity
,它和以下行正常工作.然而,当我运行的线路drpLanguage
,drpShipTo
或hdnAvailableProductId
FindControl
将引发NullReferenceException
.
我并不是说它返回'null'并且我尝试访问返回对象的属性,该方法FindControl
抛出异常.根据MSDN库,这是不可能的 - FindControl
不会将任何内容列为潜在的抛出错误,它只是说如果它找不到Control,它将返回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.
}
Run Code Online (Sandbox Code Playgroud)
转换null
为DropDownList将导致异常.
如果pnlForm.FindControl("drpQuantity")
返回null
你不能施放它;)
但这会奏效:
System.Web.UI.WebControls.DropDownList drpQuantity =
pnlForm.FindControl("drpQuantity") as System.Web.UI.WebControlsDropDownList;
if(drpQuantity!=null){
//use drpQuantity here
}
Run Code Online (Sandbox Code Playgroud)
as运算符用于执行兼容类型之间的转换.As运算符类似于转换,除了它在转换失败时产生null而不是引发异常.
无论如何,使用findcontrol
仅用于数据生成的控件,在所有其他情况下使用interface
( - 实现)与用户控件上的控件进行通信.
恕我直言findcontrol
是一个在全球滥用的功能....(小猫因使用它而被杀死)
归档时间: |
|
查看次数: |
6923 次 |
最近记录: |