3

構築しているユーザーコントロールがあります(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、それと次の行は正常に機能します。ただし、、、またはの行を実行すると、drpLanguagedrpShipToスローhdnAvailableProductId FindControlされNullReferenceExceptionます。

'null'を返すという意味ではなく、返されたオブジェクトのプロパティにアクセスしようとすると、メソッドFindControlは例外をスローします。MSDNライブラリによると、これは不可能です。FindControlスローされる可能性のあるエラーとして何もリストされません。コントロールが見つからない場合はnullを返すとだけ表示されます。

FindControlNullReferenceExceptionの原因は何ですか?

- - - - - - - - -編集 - - - - - - - -

また、問題のある3つの行のいずれかをイミディエイトウィンドウで実行すると、正しい結果が得られることにも言及する必要があります。デバッグ中に検査すると、ControlCollectionのコントロールも表示されます。pnlForm

-----------------2回目の編集-------------------

確認のために、別の行を追加しました。DropDownList notThere =(DropDownList)pnlForm.FindControl( "notHere"); コントロールnotHereはページのどこにもありません。上記の行は(もちろん)コンパイルされ、デバッガーを実行すると正常に実行されます。キャストはうまくいきます。変数notThereは単にnullです。

この問題の根本的な原因は、FindControlがコントロールの検索に失敗し、DropDownListまたは他のコントロールにnullをキャストしようとしたことではありません。

4

3 に答える 3

9

問題を引き起こしているのは FindControl ではありません。

コード化した方法では、1 行で 2 つの操作を実行しています。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.
}
于 2011-01-28T14:48:40.983 に答える
7

nullDropDownList にキャストすると、例外が発生します。

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のみを対象としています。それ以外の場合はすべて(-implementation) を使用して、ユーザー コントロールのコントロールと通信します。interface

私見findcontrolは、世界中で悪用されている機能です....(子猫はそれを使用するために殺されます)

于 2011-01-28T14:49:56.163 に答える
0

(探していた) コントロールが見つからないという NullReferenceException が発生します。

試す:

DropDownList drpLanguage = (DropDownList)(pnlForm.FindControl("drpLanguage"));
DropDownList drpShipTo = (DropDownList)(pnlForm.FindControl("drpShipTo"));
HiddenField hdnAvailableProductId = (HiddenField)(pnlForm.FindControl("hdnAvailableProductId"));
于 2011-01-28T14:48:17.737 に答える