2012-01-27 192 views
8

我試圖將對象複製到Windows剪貼板並再次關閉。我的代碼是這樣的:剪貼板將對象複製到

複製到剪貼板:

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

promptsList<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>)返回true,但如果我試圖讓物體出Clipboard類與GetData(List<Data.Sources.PromptResult>)我得到的回報空值。

有沒有人有任何想法可能是錯的?

+1

我遇到了同樣的問題,但我解決了不同的看法。我所要做的就是確保**我的對象**(子對象)的每個部分都是可序列化的類型。較少的代碼。嘗試[IsSerializable方法](http://www.codeproject.com/Articles/8102/Saving-and-obtaining-custom-objects-to-from-Window)!如果你的類不是可序列化的,那麼這個異常描述了這個問題非常好。 – Bitterblue 2015-01-07 14:19:50

回答

11

OK我試圖加我用戶類型的列表到剪貼板,並把它找回來... 這裏是我的嘗試:

我的用戶類別:

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

休息代碼:

// 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 :) ......直到我標記User類作爲Serializable

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

之後,我的代碼工作。 確定它沒有答案,但也許它可以幫助你一些如何。

+0

是的,可序列化以序列化類。我通常使用XML序列化,但我猜剪貼板類使用二進制序列化。 – James 2012-01-27 14:16:22

+1

是的,它使用二進制序列化。 – Reniuz 2012-01-27 14:20:42

+0

我已經玩過這個,它似乎工作,除了我試圖提供一個文本輸出。我想我可能不得不在我自己的類上實現IDataObject。我認爲這是因爲如果我將數據對象同時設置爲序列化對象和文本字符串,那麼在嘗試獲取數據時我的對象會丟失。我認爲這可能是DataObject的SetData方法中的一個錯誤。 - 或者可能DataObject類不可序列化。 – James 2012-01-30 13:36:35

3

我有一個類似的場景,並在將我的課程標記爲可序列化之後,我開始使用它。

因此,請嘗試在您的類Data.Sources.PromptResult上放置Serializable屬性。

4

@Reniuz感謝您的幫助,它幫助我找出答案。

爲了從多個格式的剪貼板中獲取文本和自定義對象數據,我在自己的類中實現了IDataObject接口。設置數據對象的代碼必須複製標誌設置是這樣的:

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

要出再次獲取數據的標準文本,可使用檢索:

Clipboard.GetText(); 

可以使用檢索的數據數據方法:

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

的另一點,這是有幫助的是測試我把到剪貼板中的對象可以通過使用BinaryFormatter類來執行該測試被序列化。 ..如果拋出異常,複製到剪貼板也將失敗,但默默地。

所以我的類有:

[Serializable] 
public class ClipboardPromptsHolder : IDataObject 
{ 
    ... 
}