C# 剪贴板向和从剪贴板复制对象

C# 剪贴板向和从剪贴板复制对象,c#,winforms,clipboard,C#,Winforms,Clipboard,我正在尝试将对象复制到windows剪贴板上并再次关闭。我的代码如下: Clipboard.Clear(); Clipboard.SetDataObject(myClassThatImplementsIDataObject, true); 复制到剪贴板: Clipboard.Clear(); DataObject newObject = new DataObject(prompts); newObject.SetData(myString); Clipboard.SetDataObject(n

我正在尝试将对象复制到windows剪贴板上并再次关闭。我的代码如下:

Clipboard.Clear();
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true);
复制到剪贴板:

Clipboard.Clear();
DataObject newObject = new DataObject(prompts);
newObject.SetData(myString);
Clipboard.SetDataObject(newObject);
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);
}
其中
提示
是一个
列表
集合

从剪贴板复制:

Clipboard.Clear();
DataObject newObject = new DataObject(prompts);
newObject.SetData(myString);
Clipboard.SetDataObject(newObject);
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);
}
IDataObject dataObject=System.Windows.Forms.Clipboard.GetDataObject();
if(dataObject.GetDataPresent(typeof(List)))
{
类型=类型(列表);
Object obj=dataObject.GetData(类型);
返回(列表)dataObject.GetData(类型);
}
GetFormats()
显示列表中的格式,并且
GetDataPresent(list)
返回true,但是如果我尝试使用
GetData(list)
剪贴板中获取对象,则返回null


有人知道什么地方出了问题吗?

好的,我试图将我的用户类型列表添加到剪贴板并将其取回。。。 以下是我尝试过的:

我的用户类:

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);
在那之后,我的代码工作了。
好吧,这不是答案,但可能对你有所帮助。

我有一个类似的场景,在将我的类标记为可序列化后,我让它开始工作


因此,请尝试将Serializable属性放在类Data.Sources.PromptResult上

@Reniuz谢谢你的帮助它帮助我找到了答案

为了以多种格式从剪贴板中获取文本和自定义对象数据,我在自己的类中实现了IDataObject接口。设置数据对象的代码必须具有如下设置的复制标志:

Clipboard.Clear();
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true);
要再次取出数据,可使用以下方法检索标准文本:

Clipboard.GetText();
可以使用数据方法检索数据:

Clipboard.GetData("name of my class");
另一个有用的方面是测试我放入剪贴板的对象是否可以通过使用BinaryFormatter类来执行此测试来序列化。。。如果抛出异常,则复制到剪贴板也会失败,但会以静默方式进行

所以我的班级有:

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

我发现,如果您的类是从另一个类派生的,那么基类也需要被设置为[可序列化],否则这个方法就不起作用。在我的情况下,是这样的

public abstract class MyAbstractUser
{
...
}

[Serializable]
public class MyUser : MyAbstractUser
{
...
}

当我试图通过剪贴板交换MyUser的值时,它不起作用,但当我向MyAbstractUser添加[Serializable]时,它起作用了

我在试图将项目列表发送到剪贴板时遇到了这个问题。我需要的是这些项的字符串表示,而不是整个对象。我在这里尝试了一些建议,但没有效果。然而,我确实提出了自己的解决方案,我想与大家分享。见下文

public static void CopyToClipboard<T>(this IEnumerable<T> items)
{
    StringBuilder stringBuilder = new StringBuilder();

    foreach (T item in items)
        stringBuilder.Append(item.ToString()).AppendLine();

    Clipboard.SetText(stringBuilder.ToString());
}
publicstaticvoidcopytoclipboard(此IEnumberitems)
{
StringBuilder StringBuilder=新的StringBuilder();
foreach(项目中的T项目)
stringBuilder.Append(item.ToString()).AppendLine();
Clipboard.SetText(stringBuilder.ToString());
}

将其添加为扩展方法,并确保重写自定义类型的ToString()方法。

是否可以序列化以序列化该类。我通常使用XML序列化,但我猜剪贴板类使用二进制序列化。是的,它使用二进制序列化。我已经尝试过这种方法,它似乎确实有效,只是我也尝试提供文本输出。我想我可能必须在自己的类上实现IDataObject。我这样认为是因为,如果我同时使用序列化对象和文本字符串设置DataObject,那么在尝试获取数据时,对象将丢失。我认为这可能是DataObject的SetData方法中的一个错误或者预处理DataObject类不可序列化。我遇到了相同的问题,但解决方法不同。我所要做的就是确保对象(子对象)的每个部分都是可序列化的类型。到目前为止,代码更少。试试这个!如果您的类不可序列化,那么异常很好地描述了问题。