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

时间:2010-04-28 16:41:40

标签: c# winforms drag-and-drop

我正在使用C#和Winforms 3.5

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

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

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

有没有办法解决这个问题,或者更好的方法来构建它?

3 个答案:

答案 0 :(得分:17)

您可以将数据包装在公共类中。例如,假设您的基类名为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));

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

答案 1 :(得分:0)

要动态获取拖动对象,甚至不知道其类型或基类型,我在DragDrop事件中使用此代码:

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

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

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

答案 2 :(得分:0)

要详细说明Abdulhameed Shalabi的答案,请确保该对象属于预期的类型;否则,尝试投射将引发异常。

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

public static int computeProduct(int first , int second) 
{
    int max = 40;
    int min = 10;

    if (min <= first) {
        if (first <= max) {
            if (min <= second) {
                if (second <= max) {
                    return first*second;
                }
            }
        }
    }
    System.out.println("Number is not in range, please try again");
    return 0;
}