2009-06-09 14 views
6

Ich habe eine WinForms-Anwendung, wo ich Drag-and-Drop zwischen 2 TreeViews mache.Ausnahme beim Ziehen und Ablegen verschluckt

An einem bestimmten Punkt möchte ich die Aktion in der zugrunde liegenden Business-Implementierung ablehnen, so dass ich eine Ausnahme auslösen. Ich kann die Ausnahme im Ausgabefenster sehen, aber das Problem ist, dass ich es nicht in der Benutzeroberfläche sehen kann und es nicht abstürzt.

Wo ist die Ausnahme geblieben?

Hier ist ein Code, der das Problem beschreibt:

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

Sie werden wahrscheinlich einige Code für diesen einen teilen wollen – AlexCuse

Antwort

10

fand ich diese Erklärung im Internet:

Auch mit Drag-and-Drop innerhalb der gleichen Anwendung, der Drag-and-Drop über den Standard-OLE-Drag & Drop-Mechanismus gehandhabt wird. Aus Sicht von OLE handelt es sich um zwei Anwendungen, die Quelle und das Ziel und entkoppelt diese entsprechend. Da OLE weit länger als .NET ist, hat OLE kein Konzept für eine .NET-Ausnahme und kann daher keine Ausnahme vom Ziel zurück zur Quelle kommunizieren. Selbst wenn es möglich wäre, warum sollte die Quelle darauf achten, dass das Ziel den Fall nicht ausführen konnte? Wenn Sie während eines DragDrop-Ereignisses eine Ausnahme behandeln möchten, müssen Sie diese innerhalb Ihres DragDrop-Ereignishandlers behandeln. Sie wird nicht über diesen Ereignishandler hinaus weitergegeben, da zwischen verwaltetem und nicht verwaltetem Code ein Übergang zwischen Quelle und Ziel besteht.

Siehe here die erste Antwort nach der Frage.

+0

Danke, sehr interessanter Beitrag –

0

Die Ausnahme wahrscheinlich irgendwo auf einem Hintergrund-Thread auftritt. Sie müssen einen Handler für die AppDomain.CurrentDomain.UnhandledException oder das Application.ThreadException-Ereignis erstellen.

Weitere Details finden Sie unter here.

+0

Ich habe beide Handler erstellt, aber die Ausnahme wird in keinem von ihnen angezeigt. Gibt es noch andere? –

+0

Im Visual Studio, drücken Sie Debug-> Exceptions, und markieren Sie die "geworfen" Box neben "Common Language Runtime Exception". Dies sollte dazu führen, dass der Debugger in den Code einbricht, sobald eine Ausnahme ausgelöst wird, und Sie können F10/F11 verwenden, um den Pfad zu verfolgen, den er verfolgt. –

Verwandte Themen