使用子类DataObject作为剪贴板DataObject

时间:2013-12-04 15:09:03

标签: vb.net clipboard idataobject

当我尝试以下操作时,结果出乎意料。任何想法都将非常感激!

    Class DataObjectSub
        Inherits DataObject

    End Class

    Sub Test()

        Dim myObject = New DataObjectSub

        myObject.SetData("Test")
        Clipboard.SetDataObject(myObject)

        Dim myRetrievedObject As IDataObject = Clipboard.GetDataObject
        Console.Write(myRetrievedObject.GetType.ToString)

        Dim myRetrievedObject2=TryCast(Clipboard.GetDataObject,DataObjectSub)

    End Sub

myRetrievedObject2是Nothing

Write语句的输出是:“System.Windows.Forms.DataObject”。不应该是“DataObjectSub”吗?我错过了一些明显的东西吗?

按要求编辑:

在拖放操作的情况下,再次使用DataObject(实现iDataObject),可以这样做:

Sub TestDragDrop

Dim myObject as iDataObject=new DataObjectSub

someControl.DoDragDrop(myObject, myAllowedEffects)

End Sub

稍后......在DragOver事件处理程序中:

Sub anotherControl_DragOver(sender as object, e as DragEventArgs)

Dim myRetrievedObject1 as DataObjectSub = TryCast(e.Data, DataObjectSub)
Dim myRetrievedObject2 as IDataObject = e.Data


End Sub

效果很好,myRetrievedObject1和myRetrievedObject2都不是Nothing。两个检索对象的类型都是DataObjectSub。

感谢您的任何想法和耐心! :)

1 个答案:

答案 0 :(得分:1)

这不是意料之外的行为。 Clipboard.GetDataObject只会将数据存储在Clipboard(由MSDN引用)中,其类型为DataObject(由您的代码引用)。检查其类型时,输入变量是DataObject还是任何其他类型(GetDataObject支持)无关紧要。请记住GetDataObject是一种方法,其返回值不需要遵循默认的赋值规则(即,调用它不会产生与向{{1}分配String变量相同的效果。例如,变量。)。

此代码:

Object

输出与您的代码完全相同的结果。 Dim myString As String = "Test" Clipboard.SetDataObject(myString) Dim myRetrievedObject As IDataObject = Clipboard.GetDataObject Console.Write(myRetrievedObject.GetType.ToString) 只检查myRetrievedObject.GetType.ToString的类型,始终为GetDataObject

更新

在我们讨论之后,我想澄清DataObject返回Clipboard.GetDataObject变量(IDataObject的接口,而不是其他类型)。示例代码以了解所有这些:

DataObject

正如您所看到的(满足两个条件,意味着所有变量同时属于Dim myRetrievedObject1 As IDataObject = Clipboard.GetDataObject Dim myRetrievedObject2 As DataObject = New DataObject(Clipboard.GetDataObject) Dim myRetrievedObject3 As DataObject = DirectCast(Clipboard.GetDataObject, DataObject) Dim test4 As DataObject = New DataObject If (TypeOf myRetrievedObject1 Is DataObject AndAlso TypeOf myRetrievedObject2 Is DataObject AndAlso TypeOf myRetrievedObject3 Is DataObject AndAlso TypeOf test4 Is DataObject) Then 'Condition is met End If If (TypeOf myRetrievedObject1 Is IDataObject AndAlso TypeOf myRetrievedObject2 Is IDataObject AndAlso TypeOf myRetrievedObject3 Is IDataObject AndAlso TypeOf test4 Is IDataObject) Then 'Condition is met End If DataObject类型),关系IDataObject / {{ 1}}不像两种不同类型之间的那种。实际上,如DataObject所示,转换只是一个正式的要求(我正在向IDataObject投射myRetrievedObject3变量!)。 DataObject / DataObject基本上是同一枚硬币的两面(称为DataObject。这意味着以下条件为真:

IDataObject

也就是说,DataObjectDim Type1 As String = myRetrievedObject1.GetType().ToString() Dim Type2 As String = myRetrievedObject2.GetType().ToString() Dim Type3 As String = myRetrievedObject3.GetType().ToString() Dim Type4 As String = test4.GetType().ToString() If (Type1 = Type2 AndAlso Type1 = Type3 AndAlso Type1 = Type4 AndAlso Type1 = GetType(DataObject).ToString) Then 'Condition is met End If 变量的类型名称为DataObject(或更确切地说:IDataObject)。