C# Drag and Drop - e.Data.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]);

как e.Data.GetFormats()[0] всегда будет содержать строковое представление типа перетаскиваемого объекта.

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

Чтобы уточнить ответ Абдулхамида Шалаби, убедитесь, что объект соответствует ожидаемому типу; в противном случае исключение будет выдано при попытке сотворения.

Одним из способов является простая попытка перехвата и игнорирование перетаскивания, если попытка не удалась.

try {
    baseClass item = (baseClass)e.Data.GetData( e.Data.GetFormats( )[0] );
    if (item != null ) { do stuff }
} catch { }
Другие вопросы по тегам