Reputation: 2581
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?
Upvotes: 11
Views: 14347
Reputation: 55
To elaborate on Abdulhameed Shalabi's answer, make sure the object is of the type expected; otherwise an exception will be thrown on the attempt to cast.
One way is a simple try-catch and ignore the drag-drop if the try fails.
try {
baseClass item = (baseClass)e.Data.GetData( e.Data.GetFormats( )[0] );
if (item != null ) { do stuff }
} catch { }
Upvotes: 0
Reputation: 352
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.
Upvotes: 2
Reputation: 53699
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?
Upvotes: 23