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

Fre*_*Boy 10 c# drag-and-drop winforms

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

我有一个问题,就是我想接受一个特定的类型,说SomeType和从它派生的所有类型.似乎GetDataPresent不支持这样的要求.

任何的想法?

Han*_*ant 22

只是不要使用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*lor 6

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

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

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

public class DragDropInfo 
{ 
  public DragDropBaseData Value { get; private set; } 

  public DragDropInfo(DragDropBaseData value) 
  { 
    this.Value= value; 
  } 
}
Run Code Online (Sandbox Code Playgroud)

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

DoDragDrop(new DragDropInfo(new DragDropDerivedData() ), DragDropEffects.All); 
Run Code Online (Sandbox Code Playgroud)

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

e.Data.GetData(typeof(DragDropInfo)); 
Run Code Online (Sandbox Code Playgroud)