2012-01-27 189 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 
{ 
    ... 
}