剪贴板复制对象和从中复制对象

时间:2012-01-27 11:32:38

标签: c# winforms clipboard

我正在尝试将对象复制到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>)我得到一个null的返回。

有没有人知道可能出现什么问题?

5 个答案:

答案 0 :(得分:14)

好的我尝试将我的用户类型列表添加到剪贴板并将其恢复... 这是我试过的:

我的用户类:

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
{ 
    //...   
}

之后我的代码工作了。 好吧,这不是答案,但也许它可以帮助你如何。

答案 1 :(得分:4)

@Reniuz感谢您的帮助,它帮助我找到答案。

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

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

要再次获取数据,可以使用以下方法检索标准文本:

Clipboard.GetText();

可以使用数据方法检索数据:

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

另一个有用的方法是测试我放入剪贴板的对象是否可以通过使用BinaryFormatter类来执行此测试来序列化...如果抛出异常,复制到剪贴板也会失败,但是默默地。

所以我的班级有:

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

我发现,如果您的类是从其他类派生的,则还需要将基类设为[Serializable],否则该配方将不起作用。就我而言,就像

public abstract class MyAbstractUser
{
...
}

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

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

答案 4 :(得分:0)

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

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());
}

将其添加为扩展方法,并确保覆盖自定义Type的ToString()方法。