Как работать с GetDataPresent, чтобы он мог принимать все производные типы - PullRequest
10 голосов
/ 10 сентября 2011

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

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

Есть идеи?

Ответы [ 2 ]

20 голосов
/ 10 сентября 2011

Только не используйте 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 всегда приводит только к формату one , отображаемому имени типа объекта.По этой же причине GetDataPresent не может работать с производными объектами.

6 голосов
/ 10 сентября 2011

Я уже ответил на аналогичный вопрос ранее: 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)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...