2010-06-30 12 views
8

Implementé arrastrar y soltar en mi aplicación, pero estoy teniendo algunas dificultades para determinar el tipo de objeto que se está arrastrando. Tengo una clase base Indicator y varias clases derivadas de ella. Un objeto arrastrado podría ser de cualquiera de estos tipos. El siguiente fragmento de código parece poco elegante y es propenso a problemas de mantenimiento. Cada vez que agreguemos una nueva clase derivada, debemos recordar tocar este código. Parece que deberíamos poder usar la herencia aquí de alguna manera.Cómo determinar el tipo de datos 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; 
    } 
    } 

Del mismo modo, tenemos problemas utilizando GetData para conseguir realmente el objeto arrastrado:

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

Gracias.

Respuesta

8

almacenar sus datos especificando explícitamente el tipo, es decir

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

Esto le permitirá recuperar sólo en función del tipo Indicator, en lugar del tipo de niños.

+0

¡Eso funciona como un campeón! Para completar su solución: Dentro de OnMouseDown, solía tener: Ahora, se ve así: DataObject d = new DataObject(); d.SetData (typeof (indicador), indicador); DoDragDrop (d, DragDropEffects.Move); – NascarEd

2

Ahí está el IDataObject.GetFormats método:

devuelve una lista de todos los formatos que los datos almacenados en este caso se asocia con o se puede convertir en.

Es un conjunto de String:

String[] allFormats = myDataObject.GetFormats(); 

A continuación, puede comprobar esa lista para su tipo, uno de los cuales debe ser Indicator que habría pensado.

Cuestiones relacionadas