如何处理GetDataPresent让它接受所有派生类型

我正在使用drgevent.Data.GetDataPresent来确定拖动的组件是否可接受。

我有一个问题,就是我想接受一个特定的类型,比如SomeType和从中派生的所有类型。 似乎GetDataPresent不支持此类要求。

任何的想法?

只是不要使用GetDataPresent(),它是样板文件,但你可以自由地按照自己的方式进行操作。 实际上检索对象并检查您是否对其类型感到满意:

  protected override void OnDragEnter(DragEventArgs drgevent) { var obj = drgevent.Data.GetData(drgevent.Data.GetFormats()[0]); if (typeof(Base).IsAssignableFrom(obj.GetType())) { drgevent.Effect = DragDropEffects.Copy; } } 

其中Base是基类的名称。 虽然GetFormats()的使用看起来很奇怪,但这种方法可以保证工作,因为拖动.NET对象只生成一种格式,即对象类型的显示名称。 这也是GetDataPresent无法用于派生对象的原因。

我之前回答过类似的问题: C#Drag-Drop – 使用基类的e.Data.GetData

你可以做的是创建一个容器类,它保存你正在拖动的数据。 然后在GetDataPresent中检查容器类类型,如果它存在,则可以读取包含数据实际实例的内容成员。

这是一个快速示例,如果您的基类型是DragDropBaseData,则可以创建以下DragDropInfo类。

 public class DragDropInfo { public DragDropBaseData Value { get; private set; } public DragDropInfo(DragDropBaseData value) { this.Value= value; } } 

然后可以使用以下命令启动拖放,其中DrafDropDerivedData是从DragDropBaseData派生的类。

 DoDragDrop(new DragDropInfo(new DragDropDerivedData() ), DragDropEffects.All); 

您可以使用以下方法访问拖动事件中的数据

 e.Data.GetData(typeof(DragDropInfo));