2011-10-04 12 views
5

मैं अपने पृष्ठ पर एक घटना नलसाजी समस्या से परेशान हूं। मेरे पास एक एकल ASP.NET UserControl है जो कुछ ब्राउज़र-साइड ईवेंट पर नज़र रखता है और उन्हें सर्वर पर UpdatePanel async-post-backs के रूप में उठाता है। आइए इसे इवेंटपंप कहते हैं। इसमें ईवेंट प्रबंधित करने के लिए कुछ जावास्क्रिप्ट और सर्वर-साइड नियंत्रण शामिल हैं। यह बहुत अच्छा काम करता है।एकल एएसपी.NET UserControl घटना के लिए एकाधिक ग्राहक?

मेरे पास एक ही पृष्ठ पर कई अन्य नियंत्रण हैं जो एक-दूसरे के बारे में नहीं जानते हैं लेकिन इवेंटपंप द्वारा उठाए गए कुछ कार्यक्रमों की सदस्यता लेना चाहते हैं। आम तौर पर एक नियंत्रण किसी अन्य घटनाओं की सदस्यता लेता है जिसमें उसके मार्कअप में नियंत्रण और घटनाओं को तारों को शामिल किया जाता है। लेकिन इस मामले में जो मुझे इवेंटपंप के कई उदाहरण देगा, जो मैं नहीं चाहता हूं।

मेरे पास कई UserControls सामान्य EventPump नियंत्रण की घटनाओं की सदस्यता कैसे ले सकते हैं?

उत्तर

1

कुछ अतिरिक्त विकल्प मैं के बारे में सोच सकते हैं:

  1. इंटरफेस के कोड, इसलिए EventPump नियंत्रण IEventPump जो एक विभिन्न सार्वजनिक आयोजनों है लागू करता है।युक्त पेज एक संपत्ति 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..."; 
} 

संपादित

उपयोगकर्ता नियंत्रण भर में घटनाओं लागू के लिए यह लेख देखें:

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

+1

मैं आप इस पीछे की ओर पहुंच चुका है। मुद्दा यह है कि एकाधिक उपयोगकर्ता नियंत्रण किसी अन्य उपयोगकर्ता नियंत्रण पर ईवेंट पर सब्सक्राइब करना चाहते हैं, लेकिन उनके पास बाद के नियंत्रण तक सीधे पहुंच नहीं है। –

0

विकल्पों में से एक जोड़े:

  1. एक मास्टर पृष्ठ पर EventPump रखो और एक संपत्ति बनाने यह संदर्भ देता है (@MasterType निर्देश के माध्यम से मास्टर पेज "दृढ़ता से टाइप किया गया" बनाकर)

  2. एक स्थिर सहायक विधि जोड़ें जो पैरामीटर के रूप में पृष्ठ उदाहरण लेता है, और पृष्ठ पर EventPump उदाहरण पाता है। इसके लिए FindControl का उपयोग करने के बजाय, जो बड़े पृष्ठों पर धीमा हो जाएगा, आप पेज में नियंत्रण को आसानी से पंजीकृत कर सकते हैं। इटम्स। यह दृष्टिकोण इवेंटपंप नियंत्रण में कोड के साथ सबसे अच्छा संयुक्त है जो सुनिश्चित करता है कि पृष्ठ पर केवल एक इवेंटपंप उदाहरण मौजूद है।

  3. ScriptManagerProxy की शैली में EventPumpProxy नियंत्रण बनाएं। यह कुछ हद तक कमजोर है, लेकिन अगर आप बहुत सारे कोड-बैक के बजाय स्थानीय रूप से घोषणात्मक मार्कअप करना पसंद करते हैं तो अच्छा है। मुझे सटीक कार्यान्वयन विवरण नहीं पता है, लेकिन आप AJAX फ्रेमवर्क स्रोतों को अलग करके उन्हें देख पाएंगे।

संबंधित मुद्दे