Как определить тип данных из DragEventArgs - PullRequest
8 голосов
/ 30 июня 2010

В моем приложении реализовано перетаскивание, но у меня возникли трудности с определением типа перетаскиваемого объекта. У меня есть базовый класс 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 ]

8 голосов
/ 30 июня 2010

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

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

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

2 голосов
/ 30 июня 2010

Существует метод IDataObject.GetFormats:

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

Это массив String:

String[] allFormats = myDataObject.GetFormats();

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

...