C# перетаскивание-e.Данные.GetData с использованием базового класса
Я использую C# и Winforms 3.5
у меня есть список пользовательских элементов управления, производных от одного базового класса. Эти элементы управления могут быть добавлены в различные панели, и я пытаюсь реализовать функцию перетаскивания, проблема, с которой я сталкиваюсь, - это событие DragDrop.
Для DragEventArgs e.Data.GetData(typeof(baseClass))
не работает. Он хочет:
e.Data.GetData(typeof(derivedClass1))
e.Data.GetData(typeof(derivedClass2))
etc...
есть ли способ обойти это, или лучший способ его архитектора?
2 ответов
вы можете обернуть данные в общий класс. Например, если базовый класс называется 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));
правильно ли я понял ваше требование?
чтобы получить перетаскиваемый объект динамически, даже не зная его тип или его базовый тип, я использую этот код внутри DragDrop
событие:
baseClass myObject = (baseClass)e.Data.GetData(e.Data.GetFormats()[0]);
as e.Data.GetFormats()[0]
всегда будет содержать строковое представление типа перетаскиваемый объект.
обратите внимание, что я предположил, что один объект был перетащен, но идея одинакова для нескольких перетаскиваемых объектов.