C# 拖放 - 使用基类的 e.Data.GetData

Posted

技术标签:

【中文标题】C# 拖放 - 使用基类的 e.Data.GetData【英文标题】:C# Drag and Drop - e.Data.GetData using a base class 【发布时间】:2011-02-13 10:57:55 【问题描述】:

我正在使用 C# 和 Winforms 3.5

我有一个用户控件列表,这些控件都派生自一个基类。这些控件可以添加到各种面板中,我正在尝试实现拖放功能,我遇到的问题是 DragDrop 事件。

对于 DragEventArgs e.Data.GetData(typeof(baseClass)) 不起作用。它想要:

e.Data.GetData(typeof(derivedClass1))
e.Data.GetData(typeof(derivedClass2))
etc...

有什么方法可以解决这个问题,或者有更好的架构方法吗?

【问题讨论】:

会有一个相互接口来提供帮助吗? 不,界面不会改变任何东西。 【参考方案1】:

您可以将数据包装在一个通用类中。例如,假设您的基类名为 DragDropBaseControl

public class DragDropInfo

  public DragDropBaseControl Control  get; private set; 

  public DragDropInfo(DragDropBaseControl control)
  
    this.Control = control;
  

然后就可以在基类中用下面的内容来启动拖拽

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

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

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

我是否正确理解了您的要求?

【讨论】:

我会尝试并返回,但它看起来很有希望。【参考方案2】:

为了动态获取拖动的对象,甚至不知道它的类型或基本类型,我在DragDrop 事件中使用了这段代码:

baseClass myObject = (baseClass)e.Data.GetData(e.Data.GetFormats()[0]);

e.Data.GetFormats()[0] 将始终保存被拖动对象类型的字符串表示形式。

请注意,我假设有一个对象被拖动,但多个拖动对象的想法是相同的。

【讨论】:

【参考方案3】:

要详细说明 Abdulhameed Shalabi 的回答,请确保对象属于预期类型;否则在尝试转换时会抛出异常。

一种方法是简单的 try-catch,如果尝试失败则忽略拖放。

try 
    baseClass item = (baseClass)e.Data.GetData( e.Data.GetFormats( )[0] );
    if (item != null )  do stuff 
 catch  

【讨论】:

以上是关于C# 拖放 - 使用基类的 e.Data.GetData的主要内容,如果未能解决你的问题,请参考以下文章

C#:你如何获得一个类的基类?

#yyds干货盘点# C#中类的override和virtual

C#中类的override和virtual

C#在自己的构造函数之后调用基类的构造函数?

C#关键字学习

c#核心基础--类的继承