2009-06-09 15 views
6

Tengo una aplicación WinForms donde estoy arrastrando y soltando entre 2 TreeViews.Excepción tragada al arrastrar y soltar

En algún momento, quiero rechazar la acción en la implementación empresarial subyacente, por lo que lanzo una excepción. Puedo ver la excepción en la ventana de salida, pero el problema es que no puedo verlo en la interfaz de usuario y no se cuelga.

¿Adónde fue la Excepción?

Aquí hay un código que describe el problema:

private TreeView tvLeft; 
private TreeView tvRight; 
private Dictionary<string, int> dico = new Dictionary<string, int>(); 

void tvLeft_DragDrop(object sender, DragEventArgs e) { 

    if (e.Data.GetDataPresent(typeof(TreeNode))) { 

    var tnSource = (TreeNode) e.Data.GetData(typeof(TreeNode)); 
    var tnDestination = tvLeft.GetNodeAt(tvLeft.PointToClient(new Point(e.X, e.Y))); 

    // if I drag-drop the same node twice, there sould be an Exception 
    // since the key is already in the dictionary... 
    // ...but I get no Exception in the UI, the Application.ThreadException 
    // or Appomain.CurrentDomain.UnhandledException handlers 
    dico.Add(tnSource.Name, (new Random()).Next()); 

    } 

} 
+2

Probablemente querrá compartir un código para este – AlexCuse

Respuesta

10

me encontré con esta explicación en internet:

Incluso con un simple arrastrar y soltar dentro de la misma aplicación, la de arrastrar y soltar se maneja a través del mecanismo de arrastrar y soltar OLE estándar. Desde el punto de vista de OLE, se trata de dos aplicaciones, la fuente y el objetivo, y los desacopla de manera adecuada. Como OLE ha existido por mucho más tiempo que .NET, OLE no tiene el concepto de una excepción .NET y, por lo tanto, no puede comunicar una excepción desde el destino a la fuente. Incluso si pudiera, ¿por qué a la fuente le importa que el objetivo no pueda realizar la caída? Si desea manejar una excepción durante un evento DragDrop debe manejarlo dentro de su controlador de eventos DragDrop, no se propagará más allá de ese controlador de eventos porque hay una transición de código administrado a no gestionado a administrado entre el origen y el destino.

Ver here la 1 ª respuesta después de la pregunta.

+0

Gracias, publicación muy interesante –

0

La excepción es, probablemente, ocurriendo en un subproceso de fondo en alguna parte. necesita crear un controlador para AppDomain.CurrentDomain.UnhandledException o el evento Application.ThreadException.

Vea here para más detalles.

+0

He creado ambos controladores pero la excepción no aparece en ninguno de ellos. Hay alguna otra? –

+0

En Visual Studio, pulse Depurar-> Excepciones y marque la casilla "lanzada" junto a "Excepción de Common Language Runtime". Esto debería hacer que el depurador ingrese en su código tan pronto como se lanza una excepción y puede usar F10/F11 para seguir el camino que sigue. –