C# Drag and Drop - e.Data.GetData с использованием базового класса
Я использую C# и Winforms 3.5
У меня есть список пользовательских элементов управления, все производные от одного базового класса. Эти элементы управления могут быть добавлены к различным панелям, и я пытаюсь реализовать функцию перетаскивания, проблема, с которой я работаю, связана с событием DragDrop.
Для DragEventArgs e.Data.GetData(typeof(baseClass))
не работает Хочет:
e.Data.GetData(typeof(derivedClass1))
e.Data.GetData(typeof(derivedClass2))
etc...
Есть ли способ, которым я могу обойти это, или лучший способ создать это?
2 ответа
Вы можете обернуть данные в общий класс. Например, предполагая, что ваш базовый класс называется 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));
Правильно ли я понял ваше требование?
Чтобы получить перетаскиваемый объект динамически, даже не зная его типа или его базового типа, я использую этот код внутри DragDrop
событие:
baseClass myObject = (baseClass)e.Data.GetData(e.Data.GetFormats()[0]);
как e.Data.GetFormats()[0]
всегда будет содержать строковое представление типа перетаскиваемого объекта.
Обратите внимание, что я предположил, что был перетащен один объект, но идея одинакова для нескольких перетаскиваемых объектов.
Чтобы уточнить ответ Абдулхамида Шалаби, убедитесь, что объект соответствует ожидаемому типу; в противном случае исключение будет выдано при попытке сотворения.
Одним из способов является простая попытка перехвата и игнорирование перетаскивания, если попытка не удалась.
try {
baseClass item = (baseClass)e.Data.GetData( e.Data.GetFormats( )[0] );
if (item != null ) { do stuff }
} catch { }