構築しているユーザーコントロールがあります(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の原因は何ですか?
- - - - - - - - -編集 - - - - - - - -
また、問題のある3つの行のいずれかをイミディエイトウィンドウで実行すると、正しい結果が得られることにも言及する必要があります。デバッグ中に検査すると、ControlCollection
のコントロールも表示されます。pnlForm
-----------------2回目の編集-------------------
確認のために、別の行を追加しました。DropDownList notThere =(DropDownList)pnlForm.FindControl( "notHere"); コントロールnotHere
はページのどこにもありません。上記の行は(もちろん)コンパイルされ、デバッガーを実行すると正常に実行されます。キャストはうまくいきます。変数notThere
は単にnullです。
この問題の根本的な原因は、FindControlがコントロールの検索に失敗し、DropDownListまたは他のコントロールにnullをキャストしようとしたことではありません。