2011-10-04 10 views
5

Sayfanın bir olay sıhhi tesisat sorunu üzerinde kafa karıştırıyorum. Bazı tarayıcı tarafı olayları izleyen ve bunları sunucuya UpdatePanel async-post-backs olarak yükselten tek bir ASP.NET UserControl var. Buna EventPump diyelim. Olayları yönetmek için bazı JavaScript ve sunucu tarafı kontrolleri içerir. Harika çalışıyor.Tek bir ASP.NET UserControl olayı için birden çok abone var mı?

Aynı sayfada birbirini bilmeyen ancak EventPump tarafından yükseltilen bazı etkinliklere abone olmak isteyen birkaç başka denetime sahibim. Normal olarak, bir kontrol, bu kontrolü kendi işaretine dahil ederek ve olayları kablolayarak başkalarının olaylarına abone olur. Fakat bu durumda bana istemediğim birden çok EventPump örneği vereceğim.

Ortak EventPump denetiminin olaylarına nasıl birkaç UserControls abone olabilir?

cevap

1

Birkaç ek seçenekler:

  1. arayüzleri Kod, bu nedenle EventPump kontrolü

    bir çeşitli kamu olaylar vardır IEventPump uygular.içeren sayfa diğer tüm kullanıcı kontrolleri şöyle kaydedilmesini sağlar EventPump denilen bir özellik ile IEventPumpContainer uygular:

    ((IEventPumpContainer)Page).EventPump.MyEvent += MyEventHandler; 
    
  2. sayfa abone olmanız gerekir kontrollerin haberdar olursa o uygun yöntemler aramasını söyler misiniz olaylar ateş olduğunda kontrollerde. Örneğin:

    EventPump.MyEvent += (s, e) => SomeControl.SomeMethod(); 
    
  3. Alternatif ve belki daha iyi olayları birinci sınıf vatandaş yapmak ve abone ve olayları yükseltmek için kullanılabilecek bir olay memuru sahip olmaktır. Örneğin:

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

Kullanıcı denetleyicilerinde olay işleyicileri oluşturun ve tüm olayları sayfada aynı işleyiciye abone olun.

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); 
}  

Sayfa:

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

kod arkadaki:

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

DÜZENLEME

kullanıcı denetimleri ötesinde olay çağırmak için bu makaleye bakın:

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

+1

Ben geriye bu buldum. Sorun, birden fazla kullanıcı kontrolünün, başka bir kullanıcı denetimindeki etkinliklere abone olmak istemesidir, ancak doğrudan bu doğrudan denetime erişimleri yoktur. –

0

seçeneklerin bir çift:

  1. bir ana sayfasındaki EventPump koyun ve mülk oluşturma bu başvuruya referans veriyor (master sayfasının @MasterType yönergesiyle "yazdığı" yazarak)

  2. Sayfa örneğini parametre olarak alan statik bir yardımcı yöntem ekleyin ve sayfada EventPump örneğini bulur. Bunun için büyük sayfalarda yavaş olacak olan FindControl kullanmak yerine, kontrolü Page.Items içine kaydedebilirsiniz. Bu yaklaşım, sayfada yalnızca bir EventPump örneğinin bulunmasını sağlayan EventPump denetimindeki kodla en iyi şekilde birleştirilir. ScriptManagerProxy tarzında bir EventPumpProxy denetimi gerçekleştirin.

  3. Bu biraz klüdji, ama çok fazla kod arkası yerine yerel olarak bildirimsel işaretlemeyi tercih ederseniz hoş olur. Tam uygulama ayrıntılarını bilmiyorum, ancak AJAX çerçeve kaynaklarını sökerek bunları görebilmeniz gerekir. Aklıma

İlgili konular