2009-06-09 3 views
6

Ho un'applicazione WinForms in cui eseguo il trascinamento della selezione tra 2 TreeView.Eccezione ingerita durante il trascinamento della selezione

A un certo punto, voglio rifiutare l'azione nell'implementazione aziendale sottostante, quindi lancio un'eccezione. Posso vedere l'eccezione nella finestra di output, ma il problema è che non riesco a vederlo nell'interfaccia utente e non si blocca.

Dove è finita l'eccezione?

Ecco alcuni codice che descrive il 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

Probabilmente vorrai condividere del codice per questo – AlexCuse

risposta

10

ho trovato questa spiegazione in internet:

Anche con il drag-and-drop all'interno della stessa applicazione, il drag-and-drop viene gestita attraverso il meccanismo OLE drag-drop standard. Dal punto di vista di OLE si tratta di due applicazioni, la fonte e l'obiettivo e le disaccoppia in modo appropriato. Poiché OLE è stato utilizzato molto più a lungo di .NET, OLE non ha alcun concetto di eccezione .NET e pertanto non è in grado di comunicare un'eccezione dalla destinazione alla fonte. Anche se potesse, perché la fonte dovrebbe preoccuparsi che l'obiettivo non possa eseguire il calo? Se si desidera gestire un'eccezione durante un evento DragDrop, è necessario gestirlo all'interno del gestore di eventi DragDrop, non si propagherà oltre il gestore di eventi poiché è gestito da non gestito per la transizione del codice gestito tra l'origine e la destinazione.

Vedere here la prima risposta dopo la domanda.

+0

Grazie, post molto interessante –

0

L'eccezione è probabilmente avvenendo su un thread in background da qualche parte. è necessario creare un gestore per l'evento AppDomain.CurrentDomain.UnhandledException o Application.ThreadException.

Vedere here per ulteriori dettagli.

+0

Ho creato entrambi i gestori ma l'Eccezione non viene visualizzata in nessuno di essi. Ce n'è un altro? –

+0

In Visual Studio, premi Debug-> Exceptions e spunta la casella "gettato" sul lato "Common Language Runtime Exception". Questo dovrebbe far sì che il debugger si interrompa nel tuo codice non appena viene lanciata un'eccezione e puoi usare F10/F11 per camminare lungo il percorso che segue. –