Clipboard.ContainsData和Clipboard.GetData

时间:2011-12-15 18:54:15

标签: c# .net vb.net clipboard

我尝试使用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)。现在,我改变了对象以保留在内存中的自定义...从那时起......这个问题......

3 个答案:

答案 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块中的代码将特定于您自己的自定义对象的属性。