Как определить тип данных от 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));
}

Спасибо.

8
задан NascarEd 30 June 2010 в 14:08
поделиться

2 ответа

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

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

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

8
ответ дан 5 December 2019 в 17:33
поделиться

Есть IDataObject.GetFormats метод:

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

Это массив String:

String[] allFormats = myDataObject.GetFormats();

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

2
ответ дан 5 December 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: