Я уже ответил на аналогичный вопрос ранее: C # Drag and Drop - e.Data.GetData с использованием базового класса
Что вы можете сделать, это создать контейнерный класс, который будет содержать данные, которые вы перетаскиваете. А затем в GetDataPresent вы проверяете тип класса контейнера и, если он присутствует, вы можете прочитать элемент содержимого, который содержит фактический экземпляр ваших данных.
Вот краткий пример, если ваш базовый тип - DragDropBaseData, вы можете создать следующий класс DragDropInfo.
public class DragDropInfo
{
public DragDropBaseData Value { get; private set; }
public DragDropInfo(DragDropBaseData value)
{
this.Value= value;
}
}
И затем перетаскивание может быть инициировано следующим образом, где DrafDropDerivedData является классом, производным от DragDropBaseData.
DoDragDrop(new DragDropInfo(new DragDropDerivedData() ), DragDropEffects.All);
И вы можете получить доступ к данным в событиях перетаскивания, используя следующее
e.Data.GetData(typeof(DragDropInfo));