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”类的代码。然而,这一定是我看到的你文章的第三次编辑。如果您不断更改问题/示例代码,我看不出任何人可能会回答您的问题。