Как определить тип данных из DragEventArgs

я реализовал перетаскивание в своем приложении, но у меня возникли некоторые трудности с определением типа перетаскиваемого объекта. У меня есть базовый класс Indicator и несколько классов, производных от него. Перетаскиваемый объект может быть любого из этих типов. Приведенный ниже фрагмент кода кажется неэлегантным и подвержен проблемам обслуживания. Каждый раз, когда мы добавляем новый производный класс, мы должны помнить, чтобы коснуться настоящего Кодекса. Кажется, мы должны иметь возможность использовать наследование здесь как-то.

  protected override void OnDragOver(DragEventArgs e)
  {
     base.OnDragOver(e);

     e.Effect = DragDropEffects.None;

     // If the drag data is an "Indicator" type
     if (e.Data.GetDataPresent(typeof(Indicator)) ||
         e.Data.GetDataPresent(typeof(IndicatorA)) ||
         e.Data.GetDataPresent(typeof(IndicatorB)) ||
         e.Data.GetDataPresent(typeof(IndicatorC)) ||
         e.Data.GetDataPresent(typeof(IndicatorD)))
     {
        e.Effect = DragDropEffects.Move;
     }
  }

аналогично, у нас есть проблемы с использованием GetData для фактического получения перетаскиваемого объекта:

protected override void OnDragDrop(DragEventArgs e)
{
    base.OnDragDrop(e);

    // Get the dragged indicator from the DragEvent
    Indicator indicator = (Indicator)e.Data.GetData(typeof(Indicator)) ??
                          (Indicator)e.Data.GetData(typeof(IndicatorA)) ??
                          (Indicator)e.Data.GetData(typeof(IndicatorB)) ??
                          (Indicator)e.Data.GetData(typeof(IndicatorC)) ??
                          (Indicator)e.Data.GetData(typeof(IndicatorD));
}

спасибо.

2 ответов


сохраните данные, явно указав тип, т. е.

dataObject.SetData(typeof(Indicator), yourIndicator);

Это позволит вам получить его только на основании Indicator type, а не дочерний тип.


здесь IDataObject.GetFormats способ:

возвращает список всех форматов, с которыми связаны или могут быть преобразованы данные, хранящиеся в данном экземпляре.

это массив String:

String[] allFormats = myDataObject.GetFormats();

затем вы можете проверить этот список для своего типа, один из которых должен быть Indicator Я бы подумал.