Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Drag and Drop - e.Data.GetData using a base class

I am using C# and Winforms 3.5

I have a list of user controls all derived from one base class. These controls can be added to various panels and I'm trying to implement the drag-drop functionality, the problem I'm running in to is on the DragDrop event.

For DragEventArgs e.Data.GetData(typeof(baseClass)) doesn't work. It wants:

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

Is there a way I can get around this, or a better way to architect it?

like image 328
Dustin Brooks Avatar asked Apr 28 '10 16:04

Dustin Brooks


2 Answers

You can wrap the data in a common class. For example, assuming your base class is called DragDropBaseControl

public class DragDropInfo
{
  public DragDropBaseControl Control { get; private set; }

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

And then the drag drop can be initiated with the following in the base class

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

And you can access the data in the drag events using the following

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

Have I understood your requirement correctly?

like image 132
Chris Taylor Avatar answered Oct 04 '22 14:10

Chris Taylor


To get the dragged object dynamically, without even knowing its type or its base type, I use this code inside the DragDrop event:

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

as e.Data.GetFormats()[0] will always hold string representation of the type of the dragged object.

Note that I assumed there's one object was dragged but the idea is the same for multiple dragged objects.

like image 27
Abdulhameed Avatar answered Oct 04 '22 15:10

Abdulhameed