Как обращаться с 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));