我正在建立一个用户控件(使用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");


上面的pnlFormltrAvailableCount都可以正确找到。

如果我跳到drpQuantity,它和以下几行都可以正常工作。但是,当我运行drpLanguagedrpShipTohdnAvailableProductId的行时,FindControl会抛出NullReferenceException

我并不是说它返回“ null”,而是尝试访问返回对象的属性,方法FindControl引发异常。根据MSDN库,这是不可能的-FindControl不会列出任何可能引发的错误,它只是说如果找不到控件,则返回null。

是什么导致FindControl导致NullReferenceException?

- - - - - - - - -编辑 - - - - - - - -

我还要提到的是,如果我在立即窗口中运行三个有问题的行中的任何一个,都将得到正确的结果。在调试时检查ControlCollectionpnlForm中的控件时,也可以看到它们。

-----------------第二次编辑-------------------

为了确认,我添加了另一行:
    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/

10-13 21:27