2011-10-04 15 views
5

私は自分のページでイベントの配管問題に困惑しています。私はいくつかのブラウザ側のイベントを監視し、それらをUpdatePanel async-post-backsとしてサーバーに提出する単一のASP.NET UserControlを持っています。それをEventPumpと呼ぶことにしましょう。イベントを管理するためのJavaScriptとサーバーサイドのコントロールが含まれています。それは素晴らしい作品です。単一のASP.NET UserControlイベントに対する複数のサブスクライバ?

私はお互いを知りませんが、EventPumpで発生したイベントの一部を購読したいという、同じページにいくつかのコントロールがあります。通常、1つのコントロールは、そのコントロールにそのコントロールを組み込み、イベントを配線することによって、別のイベントにサブスクライブします。しかし、このケースでは、私には望ましくないEventPumpの複数のインスタンスが与えられます。

一般的なEventPumpコントロールのイベントに複数のUserControlsを登録するにはどうすればよいですか?

答えて

1

私は考えることができるいくつかの追加オプション:EventPump制御は、様々な公共のイベントがありIEventPumpを実装して、インターフェイスに

  1. コード。含まれているページは、他のすべてのユーザーコントロールがそうのように登録することができますEventPumpと呼ばれる一つの特性でIEventPumpContainerを実装します。

    ((IEventPumpContainer)Page).EventPump.MyEvent += MyEventHandler; 
    
  2. ページを購読する必要があるコントロールを認識している場合、あなたはそれが適切なメソッドを呼び出すかもしれませんイベントが発生したときのコントロールたとえば:

    EventPump.MyEvent += (s, e) => SomeControl.SomeMethod(); 
    
  3. あるいは、そして間違いなく、より良いイベントに第一級オブジェクトを作成し、に加入し、イベントを発生させるために使用できるイベントディスパッチャを持つことです。たとえば:

    Events.Register<MyEvent>(e => TextBox.Text = "MyEvent Happened"); 
    ... 
    Events.Raise(new MyEvent()); 
    
0

ユーザーコントロールでイベントハンドラを作成し、すべてのイベントをページの同じハンドラにサブスクライブします。

のUserControl1:

public event EventHandler SomethingChanged; 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //do OnSelectedIndexChanged logic 

    if (this.SomethingChanged != null) 
     this.SomethingChanged(this, e); 
} 

protected void CheckBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    //do OnCheckedChanged logic 

    if (this.SomethingChanged != null) 
     this.SomethingChanged(this, e); 
} 

UserControl2を:

public event EventHandler SomethingElseChanged; 

protected void TextBox1_TextChanged(object sender, EventArgs e) 
{ 
    //do OnTextChanged logic 

    if (this.SomethingElseChanged != null) 
     this.SomethingElseChanged(this, e); 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //do OnClick logic 

    if (this.SomethingElseChanged != null) 
     this.SomethingElseChanged(this, e); 
}  

ページ:

<uc:UserControl1 ID="UserControl1" runat="server" SomethingChanged="UserControl_Changed" ... /> 
<uc:UserControl2 ID="UserControl2" runat="server" SomethingElseChanged="UserControl_Changed" ... /> 

コードビハインド:

protected void UserControl_Changed(object sender, EventArgs e) 
{ 
    Label1.Text = "Stuff has changed..."; 
} 

EDIT

ユーザーコントロール間でイベントを呼び出すためのこの記事を参照してください。

http://www.codeproject.com/KB/aspnet/EventsAcrossUCs.aspx

+1

私はあなたが後方にこれを持っていると思います。問題は、複数のユーザーコントロールが、別のユーザーコントロールのイベントを購読したいが、後者のコントロールに直接アクセスできないことです。 –

0

オプションのカップル:

  1. は、マスターページにEventPumpを入れて、プロパティを作成それを参照する(@MasterTypeディレクティブによってマスターページを強く型付けする)

  2. Pageインスタンスをパラメータとして使用する静的ヘルパー・メソッドを追加し、ページ上のEventPumpインスタンスを検出します。大きなページでは遅くなるFindControlを使用する代わりに、単にコントロールをPage.Itemsに登録するだけで済みます。このアプローチは、EventPumpコントロール内のコードと組み合わせて、ページに1つのEventPumpインスタンスしか存在しないようにすることをお勧めします。

  3. ScriptManagerProxyのスタイルでEventPumpProxyコントロールを作成します。これは幾分かたちですが、多くのコードビハインドの代わりに宣言的なマークアップをローカルに持つ方が好きな人にとってはうれしいです。具体的な実装の詳細はわかりませんが、AJAXフレームワークのソースを逆アセンブルすることでそれらを見ることができるはずです。