2009-03-05 2 views
1

問題をデバッグしているうちに、私がDetailsViewでテンプレートの1つでコントロールを見つけて、奇妙なことに遭遇しました。私は再帰的なFindControl Extensionを実装しました。そして、どこで私が探しているものとは全く異なるidを持つコントロールを見つけることができます。実装は基本的に親コントロール上でFindControlを呼び出すことになります。そして、子コントロール上で再帰関数を呼び出す場合は、見つからない場合は何もしません。FindControlの実装

Iリフレクタとasp.netコードに掘り始め、(System.Web.UI.WebControls.CheckBoxList内の1つ)

protected override Control FindControl(string id, int pathOffset) 
{ 
    return this; 
} 

今このcheckboxs FindControlメソッドのためにどのように実装判明私のFindControlがCheckBoxListを見つけたのはなぜですか?しかし、この実装の背後には何の推論も見られません。誰も私を啓発することができますか?

答えて

2

このFindControlの実装は、再帰的メソッドをオーバーライドしています。

protected override Control FindControl(string id, int pathOffset) 
{ 
    return this; 
} 

は上書きされています:

protected virtual Control FindControl(string id, int pathOffset) 
{ 
    string str; 
    this.EnsureChildControls(); 
if (!this.flags[0x80]) 
{ 
    Control namingContainer = this.NamingContainer; 
if (namingContainer != null) 
{ 
    return namingContainer.FindControl(id, pathOffset); 
} 

私は再帰的な方法は、現在のコントロールは、あなたが探している一つであることが知られているIEを必要とされていない場合、それが使用されるだろうと推測します。

余分読み取り MSDN

Control.FindControl検索に役立つ pathOffsetパラメーターで指定された指定されたIDと整数、とサーバ 制御するための現在の名前付けコンテナを検索します。 は、このバージョンのFindControlメソッドをオーバーライドしないでください。制御のための識別子が発見される

ID。

pathOffset
名前付けコンテナーに到達するために必要なページコントロールの階層構造アップ制御の数。

link