C # Drag and Drop - e.Data.GetData с использованием базового класса - PullRequest
7 голосов
/ 28 апреля 2010

Я использую C # и Winforms 3.5

У меня есть список пользовательских элементов управления, полученных из одного базового класса. Эти элементы управления можно добавлять на различные панели, и я пытаюсь реализовать функцию перетаскивания, проблема, с которой я работаю, связана с событием DragDrop.

Для DragEventArgs e.Data.GetData(typeof(baseClass)) не работает. Хочет:

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

Есть ли способ, которым я могу обойти это, или лучший способ его спроектировать?

Ответы [ 3 ]

17 голосов
/ 28 апреля 2010

Вы можете обернуть данные в общий класс. Например, если предположить, что ваш базовый класс называется 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));

Правильно ли я понял ваше требование?

1 голос
/ 08 февраля 2018

Чтобы получить перетаскиваемый объект динамически, даже не зная его типа или его базового типа, я использую этот код внутри события DragDrop:

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

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

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

0 голосов
/ 02 июня 2019

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

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

try {
    baseClass item = (baseClass)e.Data.GetData( e.Data.GetFormats( )[0] );
    if (item != null ) { do stuff }
} catch { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...