【问题标题】:How to deal with GetDataPresent to let it accept all the derived types如何处理 GetDataPresent 让它接受所有派生类型
【发布时间】:2011-11-14 07:16:03
【问题描述】:

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

我遇到了一个问题,我想接受一个特定的类型,比如 SomeType 以及从它派生的所有类型。似乎GetDataPresent 不支持这样的要求。

有什么想法吗?

【问题讨论】:

    标签: c# winforms drag-and-drop


    【解决方案1】:

    只是不要使用 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 对象只会产生 one 格式,即对象类型的显示名称。这也是 GetDataPresent 不能用于派生对象的原因。

    【讨论】:

    • 谢谢!这个问题涵盖了我的确切问题,答案是一个完美的解决方案! :)
    【解决方案2】:

    我之前回答过类似的问题:C# Drag and Drop - e.Data.GetData using a base class

    您可以做的是创建一个容器类来保存您拖动的数据。然后在 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)); 
    

    【讨论】:

    • 谢谢克里斯,很好的回答,但请看看汉斯的。
    • @French Boy,Hans 给出了一个很好的答案。它需要更多的反射基础设施,而不仅仅是知道所有派生类型都包装在一个名为 DragDropInfo 的已知类型中,如我的示例所示,但我严重怀疑反射是否会成为问题,所以它是一个很好的答案。
    【解决方案3】:

    我遇到了类似的问题。我希望它仅将 DragDrop 与接口一起使用,这在以太网中不起作用。 所以我把我的数据放入一个对象数组中。

    DoDragDrop(_dragDropSource, new[] { _dragDropSource.DataContext }, DragDropEffects.Move);
    
    if (((object[]) e.Data.GetData(typeof(object[])))?[0] is ICatTreeViewGroup group) {
      // do something with a group
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      相关资源
      最近更新 更多