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的主要内容,如果未能解决你的问题,请参考以下文章