2012-01-27 19 views
8

से ऑब्जेक्ट्स की प्रतिलिपि बना रहा है मैं एक ऑब्जेक्ट को विंडोज क्लिपबोर्ड पर कॉपी करने और फिर से बंद करने की कोशिश कर रहा हूं। मेरे कोड इस तरह है: क्लिपबोर्ड परक्लिपबोर्ड

कॉपी:

Clipboard.Clear(); 
DataObject newObject = new DataObject(prompts); 
newObject.SetData(myString); 
Clipboard.SetDataObject(newObject); 

कहाँ prompts एक List<Data.Sources.PromptResult> संग्रह है।

क्लिपबोर्ड बंद कॉपी करें:

IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject(); 
if (dataObject.GetDataPresent(typeof(List<Data.Sources.PromptResult>))) 
{ 
    Type type = typeof(List<Data.Sources.PromptResult>); 
    Object obj = dataObject.GetData(type); 
    return (List<Data.Sources.PromptResult>)dataObject.GetData(type); 
} 

GetFormats() सच सूची में होने के रूप में प्रारूप और GetDataPresent(List<Data.Sources.PromptResult>) रिटर्न से पता चलता लेकिन अगर मैं GetData(List<Data.Sources.PromptResult>) साथ Clipboard कक्षा से बाहर वस्तु प्राप्त करने की कोशिश मैं की वापसी प्राप्त शून्य।

क्या किसी को पता है कि क्या गलत हो सकता है?

+1

मैं एक ही समस्याओं में भाग गया, लेकिन मैं इसे दूसरे तरीके से हल किया। मुझे बस इतना करना था कि ** मेरी ऑब्जेक्ट ** (सबोबजेक्ट्स) का हर भाग एक धारावाहिक प्रकार का था। दूर तक कम कोड। [IsSerializable विधि] का प्रयास करें (http://www.codeproject.com/Articles/8102/Saving-and-obtaining- कस्टम-objects-to-from- विन्डो)! यदि आपकी कक्षा धारावाहिक नहीं है अपवाद समस्या का वर्णन बहुत अच्छा है। – Bitterblue

उत्तर

11

ठीक मैं अपने उपयोगकर्ता प्रकार की सूची में जोड़ने के लिए क्लिपबोर्ड और इसे वापस पाने की कोशिश की ... यहाँ मैं क्या करने की कोशिश की है:

मेरे उपयोगकर्ता वर्ग:

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 
संहिता की

बाकी:

जब तक मैंरूप User वर्ग चिह्नित
// Create User list and add some users 
List<User> users = new List<User>(); 
users.Add(new User { age = 15, name = "Peter" }); 
users.Add(new User { age = 14, name = "John" }); 

// Lets say its my data format 
string format = "MyUserList"; 
Clipboard.Clear(); 

// Set data to clipboard 
Clipboard.SetData(format, users); 

// Get data from clipboard 
List<User> result = null; 
if (Clipboard.ContainsData(format)) 
    result = (List<User>)Clipboard.GetData(format); 

... और परिणाम null :) था ... 10

[Serializable] 
public class User 
{ 
    //... 
} 

उसके बाद मेरा कोड काम करता था। ठीक है इसका जवाब नहीं है लेकिन शायद यह आपको कुछ कैसे मदद करता है।

+0

हां, कक्षा को क्रमबद्ध करने के लिए क्रमिक है। मैं सामान्य रूप से एक्सएमएल क्रमबद्धता का उपयोग करता हूं लेकिन मुझे लगता है कि क्लिपबोर्ड कक्षा बाइनरी क्रमबद्धता का उपयोग करती है। – James

+1

हां यह बाइनरी क्रमबद्धता का उपयोग करता है। – Reniuz

+0

मेरे पास इसके साथ एक खेल था और ऐसा लगता है कि मैं एक टेक्स्ट आउटपुट भी प्रदान करने की कोशिश कर रहा हूं। मुझे लगता है कि मुझे अपनी खुद की कक्षा में IDataObject को लागू करना पड़ सकता है। मुझे ऐसा लगता है क्योंकि अगर मैं डेटाऑब्जेक्ट को अपने सीरियलाइज्ड ऑब्जेक्ट और टेक्स्ट स्ट्रिंग दोनों के साथ सेट करता हूं तो डेटा वापस पाने का प्रयास करते समय मेरी ऑब्जेक्ट खो जाती है। मुझे लगता है कि यह DataObject की SetData विधि में एक बग हो सकता है। - या पहले डेटाऑब्जेक्ट क्लास serializable नहीं है। – James

3

मेरे पास एक समान परिदृश्य था और मेरी कक्षा को धारावाहिक के रूप में चिह्नित करने के बाद मुझे इसे काम करने के लिए मिला।

तो अपने क्लास डेटा पर Serializable विशेषता डालने का प्रयास करें। स्रोत। PrromptResult।

4

@Reniuz आपकी मदद के लिए धन्यवाद, इससे मुझे जवाब देने में मदद मिली है।

कई प्रारूपों के साथ क्लिपबोर्ड से टेक्स्ट और कस्टम ऑब्जेक्ट डेटा प्राप्त करने के लिए मैंने अपनी कक्षा में IDataObject इंटरफ़ेस लागू किया है।

Clipboard.Clear(); 
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true); 

बाहर फिर से डेटा प्राप्त करने के लिए मानक पाठ का उपयोग कर प्राप्त किया जा सकता है::

Clipboard.GetText(); 

डेटा का उपयोग कर प्राप्त किए जा सकें डेटा ऑब्जेक्ट सेट करने के लिए कोड की नकल झंडा इस तरह से निर्धारित होनी चाहिए डेटा विधि:

Clipboard.GetData("name of my class"); 

अन्य मुद्दा यह है कि मददगार था परीक्षण करने के लिए है कि वस्तु मैं क्लिपबोर्ड में डाल दिया गया था इस परीक्षण को करने के लिए BinaryFormatter वर्ग का उपयोग करके धारावाहिक जा सकता था। .. अगर एक अपवाद फेंक दिया गया है कि क्लिपबोर्ड पर कॉपी करना भी असफल होगा, लेकिन चुपचाप।

तो मेरी कक्षा है:

[Serializable] 
public class ClipboardPromptsHolder : IDataObject 
{ 
    ... 
} 
संबंधित मुद्दे