同じユーザー入力に応答する必要がある複数のユーザー コントロールを扱ってきました。
System.Web.UI.Page から継承した基本ページを作成しました。ここにユーザー入力をプロパティとして含めました (これについては後で詳しく説明します)。
このインターフェースを定義しました
public interface IRespondToInput
{
int InputID
{
get;
set;
}
}
わかりました、正確にはそう呼ばれていませんでしたが、変更が実装されていることを確認したかった各ユーザーコントロール。このインターフェイスは、ベース ページのプロパティを反映する単一のプロパティで構成されていました。
public int InputID
{
get
{
return _inputID
}
set
{
_inputID = value;
SetInputs(this, _inputID);
}
}
基本ページ メソッドのセッターで、コントロール階層を再帰的にジャンプするルーチンを呼び出し、IRespondToInputを実装するものを探し、このインターフェイスに一致するユーザー コントロールが見つかるたびにプロパティを設定します。(コードを参照)
protected void SetInputs( Control theControl, int theInputID )
{
if (theControl.Controls.Count > 0)
{
foreach (Control mySubControl in theControl.Controls)
{
if (mySubControl is UserControl || mySubControl is System.Web.UI.HtmlControls.HtmlForm)
{
if (mySubControl is IRespondToInput)
{
((IRespondToInput)mySubControl).InputID = theInputID;
}
SetInputs(mySubControl, theInputID);
}
}
}
}
これにより、ユーザー コントロールでローカル バインド イベントがトリガーされます。
実際には、継承されたページからプロパティを呼び出すこともできました。
例 (ユーザー コントロール コード ビハインド)
int mySetting = ((MyBasePage)Page).InputID;
準拠したコントロールを準拠したページにドロップして、それらを機能させたかっただけです。このアプローチはあなたのために働くかもしれません。
オリジナルポスター用に追加
このロジックを派生ベース ページに配置したくない場合は、別の UserControl ( D - 例の続き ) を作成して、切り替えロジックをカプセル化し、IRespondToInputインターフェイスを実装するすべてのコントロールを見つけてみませんか?
この UserControl では、セッターは次のようになります:-
public int InputID
{
get
{
return _inputID
}
set
{
_inputID = value;
SetInputs(Page, _inputID);
}
}
このコントロールを UserControls A、B、および C のサブコントロールとして組み込みます。
このように、すべてのページをADerivedPageにする必要はありません。ユーザー コントロールを必要なページに配置するだけで済みます。Page
から継承されるため、パラメーターとして渡すことも問題ありませんControl
。