【问题标题】:VB.NET Drag Drop If Object Implements InterfaceVB.NET拖放如果对象实现接口
【发布时间】:2010-09-02 19:51:14
【问题描述】:

我必须错过一些简单的东西,但我的大脑快要为此流血了。

为了参数,我有一个名为 MyInterface 的接口。

我有一个控制类,我们将其命名为“父类”,它实现了 MyInterface。

我有另一个继承父控件的类,称为“子”

我有一个最终的控制类,我们称之为“容器”,它接受将父级拖到它上面。

Container for Dragover 中的代码很简单,如下所示:

    Protected Overrides Sub OnDragOver(ByVal e As System.Windows.Forms.DragEventArgs)
       If e.Data.GetDataPresent(GetType(Parent)) Then
           e.Effect = DragDropEffects.Move
       End If
       MyBase.OnDragOver(e)
       Refresh()
    End Sub

我想修改它,不仅接受 Parent,而且接受任何实现 MyInterface 的东西。我无法弄清楚如何让它工作。

更令人困惑的是,如果我将子项拖到容器上,并使用上面的代码(检查是否删除了父项),GetDataPresent 总是返回 false。我认为它会起作用,因为 Child 继承了父母。

理想情况下,我会有这样的东西:

    Protected Overrides Sub OnDragOver(ByVal e As System.Windows.Forms.DragEventArgs)
       If e.Data.GetDataPresent(GetType(MyInterface)) Then
           e.Effect = DragDropEffects.Move
       End If
       MyBase.OnDragOver(e)
       Refresh()
   End Sub

但是无论我拖动的是父级还是子级,它都会爆炸并且 GetDataPresent 返回 false。我在某个地方是个白痴……但我不知道在哪里。帮忙?

【问题讨论】:

    标签: vb.net interface drag-and-drop


    【解决方案1】:

    Data 对象使用类型作为集合中的键。所以它会寻找完全匹配的。

    我相信你需要检查Data中是否有一个Object可用(即绝对任何对象),如果有,检索它并检查它是否支持与TypeOf的接口。

    【讨论】:

    • 啊,我不知道它会这样工作。我一直认为它在内部进行了某种检查,例如 TryCast,而不是查找。很高兴知道。是的,检查对象很容易,但我会只得到普通对象吗? GetData() 需要一个类型,并且将 MyInterface 甚至 System.Object 传递给它不会返回任何内容。我试过这样:e.Data.GetData(GetType(MyInterface))
    • @instantmusic 要得到一个普通的对象,你需要把一个普通的对象放在第一位:) DataObject.SetData(GetType(Object), your_object)
    • 关闭,但没有雪茄(除非我只是不明白)。 SetData 只是更改了 e.Data 中的数据,但我已经从其他地方的 DoDragDrop 获得了信息。但是,GetData 总是不返回任何内容,除非我告诉它要接收的确切类型,我自然不想这样做,因为我正在检查 MyInterface 而不是类型。果然,拖放信息正在进入潜艇。
    • @instantmusic 是的,我说的是DoDragDrop 位。 SetData 是你为 DoDragDrop 准备的 Data 对象,而不是 e.Data
    • 啊,我想我知道你在说什么。所以我在我的 DoDragDrop 中尝试了这个: MyBase.DoDragDrop(New DataObject(GetType(MyInterface).ToString, Me), DragDropEffects.All) 它奏效了!如果我理解正确,使用 New(format,object) 与声明 DataObject 相同,然后使用 SetData。无论哪种方式,它现在都在工作......我只是在 DoDragDrop 中传递原始对象而不使用 DataObject......呵呵。非常感谢您在这方面的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多