我尝试使用Clipboard类粘贴一些复制的对象。
<Serializable()> Public Class DogsZoo
Public Property Dogs As List(Of Dog)
Public Property Workers As List(Of Worker)
Public Sub New(dogs As List(Of Dog), workers As List(Of Worker))
Me.Dogs = dogs
Me.Workers = workers
End Sub
End Class
Dim myDogsZoo = myCity.GetDogsZoo()
Clipboard.SetData("dogs", myDogsZoo)
' bla bla , some actions '
If Not Clipboard.ContainsData("dogs") Then Throw New Exception("Clipboard")
' here I obtain Nothing !?'
Dim clipboardObject = Clipboard.GetData("dogs")
验证Clipboard.ContainsData(myFormat)成功通过,但当我尝试获取数据时,我获得null(Nothing)。这是正确的行为吗?
PS。
C#或VB.NET的答案都可以。
PPS。
我应该认识到,我使用上面的方法没有任何问题与Clipboard,当数据类型简单(一般的List)。现在,我改变了对象以保留在内存中的自定义...从那时起......这个问题......
答案 0 :(得分:0)
如果您使用自定义对象,我相信该对象必须支持序列化。
我在研究从剪贴板中读取图像和文本时发现以下文章很有用: http://msdn.microsoft.com/en-us/library/637ys738.aspx
有一节关于以自定义格式将数据写入剪贴板。我注意到你在VB.net中的代码,所以我复制了VB.net提取,如下所示:
'使用自定义演示SetData,ContainsData和GetData' 格式名称和业务对象。公共ReadOnly属性 TestCustomFormat()作为客户 得到 Clipboard.SetData(“CustomerFormat”,新客户(“客户名称”))
If Clipboard.ContainsData("CustomerFormat") Then Return CType(Clipboard.GetData("CustomerFormat"), Customer) End If Return Nothing End Get End Property
...
公共类客户
Private nameValue As String = String.Empty Public Sub New(ByVal name As String) nameValue = name End Sub Public Property Name() As String Get Return nameValue End Get Set(ByVal value As String) nameValue = value End Set End Property
结束班
希望这有帮助吗?
亲切的问候,韦恩
答案 1 :(得分:0)
小心“Dog”和“Worker”类都可以序列化......
要复制的对象需要是Serializable,这意味着,至少所有公共成员都需要可序列化。
如果没有,剪贴板操作将无声地失败。
此外,加入剪贴板的线程应该具有STA属性...
答案 2 :(得分:0)
我知道这是一个非常古老的帖子,但因为它没有解决方案,我认为我会提供一个(我的初步研究引导我在这里,但我偶然发现了问题的原因)。
要阻止我的对象遇到此线程中描述的相同问题,我必须确保它包含一个带有两个参数的构造函数,如下所示。一旦实施,粘贴效果很好。
Private Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
With info
Me.Key = .GetString("Key")
Me.Description = .GetString("Description")
' etc.
End With
End Sub
显然,With - End With块中的代码将特定于您自己的自定义对象的属性。