Как обращаться с GetDataPresent, чтобы позволить ему принимать все производные типы

Я использую drgevent.Data.GetDataPresent, чтобы определить, является ли перетаскиваемый компонент приемлемым или нет.

У меня есть проблема, которая заключается в том, что я хочу принять определенный тип say SomeType и все типы, полученные из него. Кажется, GetDataPresent не поддерживает такое требование.

Любая идея?

Ответ 1

Просто не используйте GetDataPresent(), это шаблон, но вы можете сделать это по-своему. Фактически извлеките объект и проверьте, довольны ли вы его типом:

    protected override void OnDragEnter(DragEventArgs drgevent) {
        var obj = drgevent.Data.GetData(drgevent.Data.GetFormats()[0]);
        if (typeof(Base).IsAssignableFrom(obj.GetType())) {
            drgevent.Effect = DragDropEffects.Copy;
        }
    }

Где Base - это имя базового класса. Хотя использование GetFormats() выглядит странно, этот подход гарантированно работает, потому что перетаскивание объекта .NET только когда-либо создает один формат - отображаемое имя типа объекта. Это также является причиной того, что GetDataPresent не может работать для производных объектов.

Ответ 2

Я уже ответил на аналогичный вопрос: С# 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));