Friday 15 February 2013

c# - Custom CollectionEditor doesn't serialize to aspx code -


प्रसंग

मैं एक कस्टम संग्रह संपादक / कस्टम ASP.Net वेब नियंत्रण के लिए डिजाइनर वेब नियंत्रण एक अजीब पदानुक्रम को उजागर करता है, इसलिए एक कस्टम संपादक डेवलपर्स के लिए इसे आसान बनाने के लिए करना सही काम करता था।

बिल्डिंग एएसपीएक्स कोड और वेब नियंत्रण कार्यों का उपयोग करना दूसरे शब्दों में, PersistChildren और ParseChildren जैसी चीज़ों का ध्यान रखा जाता है <वेब पेज>

वेब नियंत्रण में संपत्ति के हस्ताक्षर कुछ ऐसा दिखता है:

  [स्थायित्वमोड (स्थिरताईद्भम .इनरप्रॉपर्टी)] [थीमयोग्य (गलत)] [ब्राउजबल (गलत) ] सार्वजनिक आभासी आयामसंयोजन आयाम {प्राप्त करें; आंतरिक सेट; }   

ध्यान दें कि संपत्ति सार्वजनिक नहीं है; यदि यह सार्वजनिक था, तो डिजाइनर में सभी प्रकार की चीजें गलत हो जाएंगी। आयाम संकलन एक वर्ग है जो केवल सन्देश को प्राप्त करता है सूची & lt; आयाम & gt; आयाम वर्ग ही कुछ और नहीं है, कुछ गुणों के साथ एक बात है।

सिर्फ इसलिए कि मुझे लगता है कि यह अच्छा लग रहा है, मैं एक क्रिया से संपत्ति को संशोधित करने में सक्षम होना चाहता हूँ डिज़ाइनर। ऐसा करने के लिए, मैंने एक ControlDesigner वर्ग को लागू किया और एक ActionList को जोड़ा। क्रियाओं में से एक एक लिंकबटन है जो एक संपादक को खोलता है:

  var editor = new editors.DimensionEditor (control.Dimensions); यदि (संपादक। शोडिलाओग () == DialogResult.OK)   

संपादक ही एक विंडोज़ प्रारम्भ है, जिसमें एक सूची & lt; आयाम & gt; < / कोड> निर्माता तर्क के रूप में और संग्रह को संशोधित करता है।

समस्या

जब मैं इस कोड का उपयोग करता हूं, तो मैं देख सकता हूं कि संपादक काम करता है और नियंत्रण संग्रह को 'डिजाइनर' दृश्य में अपडेट किया जाता है। अगर मैं कई बार संपादक को खोलता हूं, तो राज्य बदलता है, जिसका अर्थ है कि स्मृति में किसी स्थान को एडिटर द्वारा अपडेट किया जाता है।

हालांकि, अगर मैं एएसपीएक्स कोड पर जाता हूं, तो मैं देख सकता हूं कि आयाम नहीं हैं अब और नहीं इसलिए, संक्षेप में समस्या यह है कि मुझे किसी भी तरह Visual Studio को एएसपीएक्स फ़ाइल में संपत्ति / सीरियल करना / जारी रखने के लिए बताना होगा। ( उस के रूप में सरल ... )

Strangely, मैं कहीं भी ऐसा नहीं कर सकता कि यह कैसे करना है ... भले ही एक सामान्य संग्रह एडिटटर लगता है

कुछ चीजें जो मैंने कोशिश की थी

अन्य गुणों के लिए मैंने देखा है कि आपको ऐसा कुछ करना होगा, लेकिन यह काम करने के लिए नहीं लगता है कोड उस बिंदु पर दर्ज किया गया था जिसे 'नीचे देखें' या कुछ मामलों में उस बिंदु से कहा गया डिज़ाइनर में एक सहायक कॉल में चिह्नित किया गया है:

  सम्पत्ति डिस्क्रिप्टर पीडी = टाइपडिस्क्रिप्टर। गेटप्रॉपर्टीज़ (बेस। कॉम्पोनेंट) [ "आयाम"]; // आंतरिक संपत्ति के साथ सेटर का उपयोग करें - & gt; कोई प्रभाव नहीं / यह। परन्तु संकल्पित परिवर्तन (यह, नया घटक परिवर्तित ईवेंटअर्ग्स (यह। घटक, पीडी, रिक्त, न्यूडिम)); - & gt; कोई प्रभाव नहीं / सूची प्राप्त करने के लिए getter का उपयोग करें - & gt; पॉप्युलेट करें कि संपादक में बनाई गई दूसरी सूची का उपयोग करना   

मुझे समझ में आ रहा है कि यह काम क्यों नहीं करता है; जाहिरा तौर पर किसी को विज़ुअल स्टुडियो को बताना होगा कि संपत्ति बदल गई है ... मुझे नहीं पता कि यह कैसे करना है।

जाहिरा तौर पर कोई स्रोत नहीं ऑनलाइन के साथ यह पता लगाने के लिए वास्तव में एक दर्द होता है कि यह कैसे करें।

असल में आप डिजाइनर को सूचित करने के लिए OnComponentChanging / Changed विधियों का उपयोग करना चाहते हैं। और जाहिरा तौर पर डिजाइनर शेष तर्क के लिए लेनदेन का उपयोग करता है। (मेरा अनुमान है कि इसे पूर्ववत / फिर से व्यवहार के साथ करना है)। सामान्य कोड के लिए यह स्वचालित रूप से किया जाता है जब आप PropertyDescriptor का उपयोग करते हैं, संग्रह के लिए यह जाहिरा तौर पर संग्रह को लपेट नहीं करता है जिसका मतलब है कि आपको इसे मैन्युअल रूप से करना होगा।

मुद्दा, आपको इस तरह एक छोटी सी विधि या तो UITypeEditor में या DesignerActionList वर्ग में लागू करने की आवश्यकता है:

  निजी शून्य ChangeAction (सूची & lt; आयाम & gt; नया आयाम) {IDesignerHost host = GetService (typeof (IDesignerHost)) के रूप में IDesignerHost; प्रॉपर्टी डिस्क्रिप्टर पीडी = टाइपडिसिप्टोर। गेटप्रॉपर्टीज़ (टाइपफ (माइकंट्रोल)) ["आयाम"]; Var आयाम = (DimensionsCollection) pd.GetValue (नियंत्रण); Var ट्रांस = host.CreateTransaction (); IComponentChangeService ccs = (IComponentChangeService) GetService (टाइपफ (IComponentChangeService)); Ccs.OnComponentChanging (नियंत्रण, पीडी); dimensions.Clear (); dimensions.AddRange (newDimensions); Ccs.OnComponentChanged (नियंत्रण, पीडी, शून्य, आयाम); trans.Commit (); }   

यदि आप UITypeEditor को लागू कर रहे हैं, तो context.Instance से EditValue का उपयोग करना सुनिश्चित करें सेवाओं को देखने के लिए नियंत्रण और दिए गए प्रदाता के रूप में

No comments:

Post a Comment