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] всегда будет содержать строковое представление типа перетаскиваемый объект.

обратите внимание, что я предположил, что один объект был перетащен, но идея одинакова для нескольких перетаскиваемых объектов.