2010-03-26 17 views
5

मेरे पृष्ठ पर मेरे पास n-userControls (समान नियंत्रण) है, मुझे उनके बीच संवाद करने की आवश्यकता है (अधिक विशिष्ट होने के लिए मुझे मूल्य में एक को पास करने की आवश्यकता है)।उपयोगकर्ता नियंत्रण के बीच डेटा साझा करें

मैं इसके लिए होस्टिंग पेज शामिल नहीं करना चाहता हूं।

नियंत्रण "पेजर्स" के रूप में कार्य करता है और मेजबान पृष्ठ पर होस्ट किए गए ईवेंट के माध्यम से होस्ट किए गए पृष्ठ पर पेज किए गए डेटा से बातचीत करता है।
तो जब उपयोगकर्ता पेजर में से किसी एक पर क्लिक करता है और इसकी स्थिति बदलता है, तो दूसरे नियंत्रण को इसके बारे में पता होना चाहिए और तदनुसार स्वयं को बदलना चाहिए।

मैं वीस्टेट का उपयोग नहीं कर सकता क्योंकि व्यूस्टेट प्रति नियंत्रण है और यह कंट्रोलस्टेट भी है।

क्या मैं इसके लिए सत्र का उपयोग कर सकता हूं? (सत्र साझा किया गया है और केवल एक मान है जिसे मुझे स्टोर करने की आवश्यकता है)

या शायद कुछ बेहतर है जिसका मैं उपयोग कर सकता हूं? (कोई क्वेरीस्ट्रिंग नहीं)

उत्तर

1

व्यक्तिगत रूप से इसे नियंत्रित पृष्ठ या किसी ईवेंट के बिना ऐसा करने का "आसान" तरीका नहीं है।

जो आप कह रहे हैं उससे मैं क्या सोचूंगा कि ऐसा कुछ होगा। अपने नियंत्रण नियंत्रण वाले दो नियंत्रण ए और बी मानते हैं।

युक्त पृष्ठ दोनों नियंत्रणों पर "पेज चयन चयन" ईवेंट की सदस्यता लेता है, उस घटना के जवाब में यह आपके पास पहले से मौजूद डेटा को अपडेट करता है, और यह "वर्तमान पृष्ठ" मान को सेट करने वाले सभी पेजर नियंत्रणों के माध्यम से गणना करता है।

आपके पास पहले से ही नियंत्रण से संचार के लिए ईवेंट नलसाजी है -> पृष्ठ, जो आपने पहले से बनाया है उसका उपयोग करें।

सत्र क्यों नहीं?

मुझे टिप्पणियों में पूछा गया था कि यह सत्र से बेहतर होगा, और जवाब कई कारणों से हाँ है।

  1. सत्र जानकारी, जब तक स्पष्ट साफ एक उपयोगकर्ता सत्र की अवधि (आमतौर पर 20 मिनट) के लिए मौजूद है
  2. नंबर 1 की becase, आप पृष्ठ के लिए आइटम जोड़ने के लिए की आवश्यकता होगी के लिए अगर (! IsPostBack) सत्र चर को "साफ़" करने के लिए ताकि उपयोगकर्ता किसी भिन्न पृष्ठ पर प्रारंभ न हो।
  3. भविष्य अनुप्रयोग विकास, सत्र जानकारी को SQL सर्वर पर प्रक्रिया से बाहर ले जाना है या अन्यथा वेब फार्म पर्यावरण में काम करने के लिए, इसके लिए मैं इसे भी टालने का प्रयास करता हूं।
  4. सत्र भंडार वेबसर्वर पर स्मृति में इस जानकारी का उपयोग, हालांकि छोटे (4 बाइट्स यदि पूर्णांक) इसे जोड़ सकते हैं और गैर-जरूरी
  5. है आपके अपडेट की प्रकृति के आधार कर सकते हैं, आप अकेले सत्र के साथ नियंत्रण आदेश सुनिश्चित नहीं कर सकते यह सुनिश्चित करने के लिए कि 1 नियंत्रण सभी नियंत्रणों के लिए एक अद्यतन को मजबूर करता है।

अन्य समाधान हैं, ऊपर दिए गए एक जैसा समाधान पृष्ठ पर एक पुनरावर्ती दिखता है, लेकिन आपको यह सुनिश्चित करने के लिए सावधान रहना होगा कि आप लूपिंग/अंतहीन रिकर्सन स्थिति में न आएं , इसके अतिरिक्त, यदि आपके पास पृष्ठ पर बहुत सारे नियंत्रण हैं, तो यह सब कुछ के माध्यम से लगातार लूप के लिए बहुत अधिक ओवरहेड जोड़ सकता है।

+0

हाँ यह काम करेगा, लेकिन यह अधिक कोड है कि मैं (फिलहाल, घटना होस्टिंग पृष्ठ नियंत्रण के साथ बातचीत नहीं करता सदस्यता लेने के बगल में) होस्टिंग पृष्ठ में जोड़ने की जरूरत है यह नियंत्रण लूप करने के लिए requre होगा की आवश्यकता है और उन्हें पेज पर खोजना। क्या यह बेहतर है तो ऑनर ​​इंटीजर इन्स सत्र को सहेजना ताकि दोनों नियंत्रण इसे पढ़ सकें? – toraan

+0

हां, इस पोस्ट में मेरा अपडेट क्यों देखें (क्यों एक टिप्पणी के लिए बहुत लंबा था) –

+0

इसलिए होस्टिंग पेज में उपयोगकर्ता नियंत्रण के लिए लूपिंग (मुझे अपने पृष्ठ पर सभी उपयोगकर्ता नियंत्रण ढूंढने की ज़रूरत है) मेरे परिदृश्य में सबसे अच्छा विकल्प है? – toraan

0

कंटेनर पृष्ठ में व्यूस्टेट में एक संपत्ति है जो राज्य को संग्रहीत करती है।जब कोई उपयोगकर्ता पेजर में से किसी एक पर क्लिक करता है, तो यह कंटेनर पेज द्वारा प्रबंधित एक ईवेंट उठाता है। यह फिर एन उपयोगकर्ता नियंत्रण के माध्यम से loops और उन नियंत्रणों पर एक सार्वजनिक विधि कॉल करता है।

0

आप पर्यवेक्षक पैटर्न का एक त्वरित संशोधित संस्करण बना सकते हैं। मैं पृष्ठों पर एक प्रबंधक नियंत्रण का निर्माण करने का सुझाव दूंगा। लेकिन यदि आप पृष्ठ को संशोधित नहीं करना चाहते हैं, तो यहां एक त्वरित समाधान है।

आप एक स्थैतिक विधि बना सकते हैं जो सभी प्रकार के नियंत्रणों को सूचित करेगी। अपने अद्यतन विधि को कॉल करके। आपको जो भी डेटा चाहिए उसे पारित करने के लिए स्वतंत्र महसूस करें।

protected void control_event(object sender, EventArgs e) 
{ 
    UpdateAllControls(page); 
} 


public static void UpdateAllControls(Control parent /* can be Page */) 
     { 
      foreach (Control c in parent.Controls) 
      { 
       if (c.GetType() == this.GetType()) 
        ((MyType)).Update() 
       if (c.HasControls()) 
        controls = GetAllControls(controls, t, c); 
      } 
     } 
+0

यह समाधान काम करेगा, हालांकि, यदि आवश्यक नहीं है, तो मैं रिकर्सन के खिलाफ सावधानी बरतूंगा। यदि आपके पास बहुत सारे नियंत्रण हैं तो यह एक महंगी प्रक्रिया हो सकती है। यदि उपयोगकर्ता नियंत्रण हमेशा पृष्ठ पर जोड़े जाते हैं, तो प्रक्रिया के रिकर्सन भाग को छोड़ दें। –

+0

यह माना जा रहा है कि आपको पता नहीं है कि पृष्ठ कैसे स्थापित किया गया है। और हाँ मैं सहमत हूं, यह एक धीमी विधि है। एक पर्यवेक्षक के साथ प्रत्येक नियंत्रण रजिस्टर सबसे अच्छा समाधान होगा। – Glennular

+0

उपरोक्त कोड पर्यवेक्षक से अलग कैसे है? – toraan

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