2010-01-21 7 views
7

This question में कस्टम ऑब्जेक्ट प्रकार का क्रॉस-प्रोसेस ड्रैग और ड्रॉप, जो मुझे रूचि है, लेकिन काफी नहीं है।WinForms C#

मेरे पास एक .NET WinForms एप्लिकेशन सी # में लिखा गया है। मेरे पास ListView नियंत्रण है जो C# ऑब्जेक्ट्स की एक श्रृंखला प्रदर्शित करता है। मैंने इसे झुका दिया है ताकि आप इन सूची दृश्य वस्तुओं को उसी एप्लिकेशन में किसी भिन्न रूप में खींच/छोड़ सकें, और यह उस अन्य रूप के लिए ड्रॉप हैंडलर पर ऑब्जेक्ट्स की सरणी (Session टाइप करें) को सही ढंग से पास कर दे।

हालांकि, अब मैं क्रॉस-प्रोसेस ड्रैग/ड्रॉप का समर्थन करना चाहता हूं जहां मैं अपने आवेदन के कई उदाहरण चलाता हूं। यह प्रतीत होता है कि यह काम करने जा रहा है (उदा। GetDataPresent सफल), लेकिन आखिरकार जब मैं डेटा को पुनर्प्राप्त करने का प्रयास करता हूं तो अपवाद फेंकता है - object[]Session[] पर नहीं डाला जा सकता है।

if (e.Data.GetDataPresent("Fiddler.Session[]")) 
{ 
    Session[] oDroppedSessions; 
    try 
    { 
     oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]"); 
    } 
    catch (Exception eX) 
    { // reaches here 
    } 
} 

किसी को भी पता है कि अगर मैं आदेश में इस काम करने के लिए मेरे वस्तुओं के लिए ISerializable को लागू करना चाहिए? आमतौर पर, मैं बस कोशिश करता हूं, लेकिन इस कक्षा के लिए ISerializable लागू करना काफी गैर-तुच्छ होगा, और मुझे चिंता है कि ऐसा करने के अजीब दुष्प्रभाव हो सकते हैं।


अद्यतन: ISerializable को लागू विधि help-- नहीं है कभी नहीं कहा जाता है। इसी प्रकार, कक्षा में Serializable विशेषता जोड़ने से कोई प्रभाव नहीं पड़ता है। कोई अन्य विचार?

+0

एक पंक्ति जोड़ें 'कंसोल। राइटलाइन (स्ट्रिंग.फॉर्मैट ("अपवाद पकड़ा गया। विवरण {0}", eX.ToString());' पकड़ ब्लॉक में। संदेश क्या होगा? – t0mm13b

+0

"ऑब्जेक्ट [] को सत्र []" – EricLaw

उत्तर

4

आप एक प्रक्रिया सीमा पार कर रहे हैं, ऑब्जेक्ट संदर्भ किसी अन्य प्रक्रिया में मान्य नहीं हैं। DataObject क्लास दीवारों को प्राप्त करने के लिए क्रमबद्ध वस्तुओं का समर्थन करता है, यह बाइनरीफॉर्मेटर का उपयोग करता है। इसलिए, हां, आपको अपनी कक्षा में [सीरियलज़ेबल] विशेषता लागू करने की आवश्यकता होगी और सुनिश्चित करें कि आपकी ऑब्जेक्ट्स सही तरीके से डी/क्रमबद्ध कर सकें।

+0

हाँ, यही वह है जिसे मैं डरता था। अगर मैं ISERializable लागू करता हूं तो क्या मैं प्रदर्शन प्रतिगमन पेश करने जा रहा हूं? इस ऑब्जेक्ट का बाइनरी क्रमबद्धता सैकड़ों केबी हो सकती है। – EricLaw

+0

कृपया हमें बताएं कि आप कब पता लगाते हैं। –

+0

हमम ...ISerializable लागू करने में मदद नहीं करता है - विधि कभी नहीं कहा जाता है। इसी प्रकार, कक्षा में सीरियलज़ेबल विशेषता जोड़ने से कोई प्रभाव नहीं पड़ता है। कोई अन्य विचार? – EricLaw

-1

आप कास्टिंग के लिए "as" का उपयोग कर सकते हैं जो अपवाद से बच जाएगा ("जैसे" कास्ट विफल होने पर अपवाद फेंकने के बिना "शून्य" वापस आ जाएगा) - लेकिन मुझे नहीं लगता कि यह आपकी समस्या का समाधान करेगा (यह होगा बस वास्तविक अपवाद से बचें), जैसा कि मैं मानता हूं कि यह संभव है कि आपको अपनी कक्षा को Serializable बनाना होगा। आप उन क्षेत्रों को टिप्पणी करके अपनी परिकल्पना का परीक्षण कर सकते हैं जो इसे काम करना कठिन होगा - अभी इसे परीक्षण करने के लिए।

+1

-1: 'NullReferenceException' के लिए' अमान्य कैस्टएक्सप्शन 'ट्रेडिंग करना जानकारी का नुकसान है। यदि आप उम्मीद करते हैं कि एक कास्ट * असफल हो सकता है तो 'as' कीवर्ड अच्छा है। अन्यथा, यह बुरा है, और मैंने इसे बहुत अधिक उपयोग किया है। –

0

ठीक है यह एक शॉट है, बजाय सत्र की एक पूरी सरणी का उपयोग कर के, व्यक्तिगत रूप से इस तरह यह कर, अपने आप को पैर में शूटिंग के अलावा अन्य की कोशिश ...

 
    Session[] oDroppedSessions; 
    try 
    { 
     if (e.Data.GetData("Fiddler.Session[]") != null){ 
      object[] objs = e.Data.GetData("Fiddler.Session[]"); 
      if (objs != null && objs.Length > 1){ 
      oDroppedSessions = new Session[objs.Length]; 
      int nIndex = 0; 
      foreach(object obj in objs){ 
       if (obj is Session){ 
        oDroppedSessions[nIndex] = (Session)obj; 
        nIndex++; 
       } 
      } 
      } 
     } 
    } 
    catch (Exception eX) 
    { // reaches here } 

वर्थ एक शॉट के रूप में मैं नहीं सत्र भाग को पूरी तरह से समझें, इसे आजमाएं ...

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।