C# Clipboard.ContainsData和Clipboard.GetData

C# Clipboard.ContainsData和Clipboard.GetData,c#,.net,vb.net,clipboard,C#,.net,Vb.net,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

我尝试使用剪贴板类粘贴一些复制的对象

  <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")
公共类DogsZoo
公共财产犬只名单(犬只)
公共财产工人名单(工人)
公共子新(狗作为(狗的)名单,工人作为(工人的)名单)
我。狗=狗
我是工人
端接头
末级
Dim myDogsZoo=myCity.GetDogsZoo()
剪贴板.SetData(“狗”,myDogsZoo)
“等等,一些行动”
如果不是Clipboard.ContainsData(“狗”),则抛出新异常(“剪贴板”)
“我什么也得不到!?”
Dim clipboardObject=Clipboard.GetData(“狗”)
验证剪贴板.ContainsData(myFormat)成功通过,但当我尝试获取数据时,我获得null(无)。这是正确的行为吗

PS.
C#或VB.NET答案都可以

PPS.

我应该认识到,我使用了上面的方法,没有任何问题与剪贴板,当数据类型简单(一个通用列表)。现在,我将要保存在内存中的对象更改为自定义对象。。。从那时起。。。这个问题…

如果您使用自定义对象,我相信该对象必须支持序列化

当我研究从剪贴板读取图像和文本时,我发现以下文章很有帮助:

有一节介绍如何以自定义格式将数据写入剪贴板。我注意到您在VB.net中编写代码,因此我复制了VB.net摘录,如下所示:

使用自定义 格式化名称和业务对象。公共只读属性 TestCustomFormat()作为客户 收到 剪贴板.SetData(“CustomerFormat”,新客户(“客户名称”))

公共类客户

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
末级

希望这有帮助


您好,Wayne

如果您使用自定义对象,我相信该对象必须支持序列化

当我研究从剪贴板读取图像和文本时,我发现以下文章很有帮助:

有一节介绍如何以自定义格式将数据写入剪贴板。我注意到您在VB.net中编写代码,因此我复制了VB.net摘录,如下所示:

使用自定义 格式化名称和业务对象。公共只读属性 TestCustomFormat()作为客户 收到 剪贴板.SetData(“CustomerFormat”,新客户(“客户名称”))

公共类客户

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
末级

希望这有帮助

亲切的问候,Wayne

注意“Dog”和“Worker”类都是可序列化的

要复制的对象需要可序列化,这意味着至少其所有公共成员都需要可序列化

否则,剪贴板操作将以静默方式失败

此外,加入剪贴板的线程应该具有STA属性…

注意“Dog”和“Worker”类都是可序列化的

要复制的对象需要可序列化,这意味着至少其所有公共成员都需要可序列化

否则,剪贴板操作将以静默方式失败


此外,加入剪贴板的线程应该具有STA属性…

我知道这是一篇非常古老的文章,但由于它没有解决方案,我想我会提供一个解决方案(我最初的研究将我带到这里,但我在其他地方偶然发现了问题的原因)

为了阻止我的对象出现这个线程中描述的问题,我必须确保它包含一个带有两个参数的构造函数,如下所示。一旦实现,粘贴就可以完美地工作

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

我知道这是一篇非常古老的文章,但由于它没有解决方案,我认为我会提供一个解决方案(我最初的研究将我带到这里,但我在其他地方偶然发现了问题的原因)

为了阻止我的对象出现这个线程中描述的问题,我必须确保它包含一个带有两个参数的构造函数,如下所示。一旦实现,粘贴就可以完美地工作

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

您忘记了Customer类的属性。。。这是最重要的。。。无论如何,我设置了这个属性,但是代码的行为没有改变……当你说“你忘记了”时,代码是从我文章中引用的MSDN文章中复制的。但是,您忘记列出必须可序列化的“dog”类的代码。然而,这一定是我看到的你文章的第三次编辑。如果您不断更改问题/示例代码,我看不出任何人可能会回答您的问题。您忘记了Customer类的属性。。。这是最重要的。。。无论如何,我设置了这个属性,但是代码的行为没有改变……当你说“你忘记了”时,代码是从我文章中引用的MSDN文章中复制的。但是,您忘记列出必须可序列化的“dog”类的代码。然而,这一定是我看到的你文章的第三次编辑。如果您不断更改问题/示例代码,我看不出任何人可能会回答您的问题。