2010-06-30 5 views
8

J'ai implémenté le glisser-déposer dans mon application, mais j'ai de la difficulté à déterminer le type de l'objet à déplacer. J'ai une classe de base Indicator et plusieurs classes dérivées. Un objet déplacé pourrait être de l'un de ces types. L'extrait de code ci-dessous semble inélégant et est sujet à des problèmes de maintenance. Chaque fois que nous ajoutons une nouvelle classe dérivée, nous devons nous souvenir de toucher ce code. Il semble que nous devrions être en mesure d'utiliser l'héritage ici d'une manière ou d'une autre.Comment déterminer le type de données à partir de DragEventArgs

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; 
    } 
    } 

De même, nous avons des problèmes en utilisant GetData pour obtenir effectivement l'objet traîné:

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)); 
} 

Merci.

Répondre

8

Stockez vos données en spécifiant explicitement le type, à savoir

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

Cela vous permettra de récupérer juste en fonction du type Indicator, plutôt que le type d'enfant.

+0

Cela fonctionne comme un champion! Pour compléter votre solution: À l'intérieur de OnMouseDown, j'avais auparavant: DoDragDrop Maintenant, cela ressemble à ceci: DataObject d = new DataObject(); d.SetData (typeof (indicateur), indicateur); DoDragDrop (d, DragDropEffects.Move); – NascarEd

2

Il y a la méthode IDataObject.GetFormats:

retourne une liste de tous les formats que les données stockées dans cette instance est associée à ou peuvent être convertis en.

Il est un tableau de String:

String[] allFormats = myDataObject.GetFormats(); 

Vous pouvez ensuite vérifier cette liste pour votre type, l'une qui devrait être Indicator je l'aurais pensé.

Questions connexes