Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么会导致FindControl()引发NullReferenceException?_C#_.net_Asp.net_Nullreferenceexception_Findcontrol - Fatal编程技术网

C# 什么会导致FindControl()引发NullReferenceException?

C# 什么会导致FindControl()引发NullReferenceException?,c#,.net,asp.net,nullreferenceexception,findcontrol,C#,.net,Asp.net,Nullreferenceexception,Findcontrol,我正在构建一个用户控件(ASP.NET3.5,使用C#) 这个控件主要基于另一个类似的控件(不幸的是,剪切粘贴继承,但是没有简单的方法来抽象它)。给我带来麻烦的行是直接从另一个控件复制的,大多数显示也是如此 相关代码行如下所示: Panel pnlForm = (Panel)e.Item.FindControl("pnlForm"); Literal ltrAvailableCount = (Literal)e.Item.FindControl("ltrAvailableCount"); Dr

我正在构建一个用户控件(ASP.NET3.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
一样可以正确找到上面的
pnlForm

如果我跳到
drpQuantity
,它和下面几行都可以正常工作。但是,当我运行
drpLanguage
drpShipTo
hdnAvailableProductId
FindControl
的行时,抛出一个
NullReferenceException

我不是说它返回'null',我尝试访问返回对象的属性,方法
FindControl
抛出异常。根据MSDN库,这是不可能的-
FindControl
没有列出任何可能引发的错误,它只是说如果找不到该控件,它将返回null

什么会导致
FindControl
出现NullReferenceException

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

我还应该提到,如果我在即时窗口中运行三个有问题的行中的任何一个,我会得到正确的结果。在调试过程中检查
pnlForm
时,我还可以看到
ControlCollection
中的控件

-----------------第二版-------------------

为了确认,我添加了另一行: DropDownList notThere=(DropDownList)pnlForm.FindControl(“notHere”); 控件
notHere
不在页面的任何位置。当然,上面这一行是编译的,当我运行调试器时,它运行得很好。演员阵容很好。变量
notThere
仅为空


此问题的根本原因不是FindControl未能找到控件,并试图将null强制转换为DropDownList或其他控件

您会得到一个NullReferenceException,但它找不到(您正在查找的)控件

尝试:


导致问题的不是FindControl

按照编码方式,它在一行上执行两个操作—FindControl(),然后转换为控件数据类型。轰炸的是强制转换,因为FindControl调用的结果是null值,而您正试图将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.
}

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
}
as运算符用于在兼容类型之间执行转换,as运算符类似于强制转换,只是在转换失败时生成null,而不是引发异常

无论如何
findcontrol
仅用于数据生成控件,在所有其他情况下,使用
接口
(-实现)与用户控件上的控件进行通信


IMHO
findcontrol
是一项在全球范围内被滥用的功能。。。。(小猫因为使用它而被杀)

你确定pnlForm不为空吗?在调试时仔细检查。您确定调用FindControl的对象中没有一个为null吗?想象FindControl()返回
null
,您对
DropDownList
的强制转换是否有效?我只是在输入我的想法…@jrummell&robertlevy-是的。正如我在问题中所说的。你应该发布转发器和它的模板。不,你没有。它返回null,与抛出一个NRE不同。如果你尝试强制转换它,那么你会得到NRE。我不相信是这样的-这个模式在我们的项目中使用,在其他任何情况下,我们都看到它可以很好地执行强制转换(尽管dropdownlist/label/control为null)。此外,如果它是无效的强制转换,它肯定会抛出InvalidCastException,而不是NullReferenceException?我修改了代码,使其看起来像您的示例,它返回了一个调试器视为DropDownList的对象。空检查后,强制转换失败。好的,所以至少您知道是强制转换失败了,而不是FindControl()。。。现在你可以看正确的地方了。现在我必须弄清楚为什么将DropDownList类型的对象强制转换为DropDownList会引发NullReferenceException…太好了。从一个不可能的问题到另一个:)接受了这个答案,因为它让我走上了解决方案的道路。这在中继器的ItemCommand中使用,这就是您所说的生成数据的意思吗?此外,这些行来自UserControl的代码隐藏,而不是从包含页面访问它。DropDownList drpLanguage=pnlForm.FindControl(“drpLanguage”)作为DropDownList;这也失败了,但有一个例外。当我尝试运行David Stratton建议的修改代码时,我检查了为此行返回的FindControl对象-它不是null…因此将DropDownList转换为DropDownList失败。更新:添加System.Web.UI.WebControl作为命名空间,也许DropDownList不是System.Web.UI.WebControls.DropDownList这样想是明智的,但我检查了一下,确实如此。另外,请参阅我上面的“第二次编辑”,我特意添加了一行,FindControl将返回null并将其转换为DropDownList,并且没有失败。
System.Web.UI.WebControls.DropDownList drpQuantity = 
   pnlForm.FindControl("drpQuantity") as System.Web.UI.WebControlsDropDownList;

if(drpQuantity!=null){
   //use drpQuantity here
}