2009-06-09 1 views
6

2つのTreeViewの間でドラッグ&ドロップを行うWinFormsアプリケーションがあります。ドラッグアンドドロップ時に例外が飲み込まれる

ある時点で、私は基本的なビジネス実装でアクションを拒否したいので、例外をスローします。私は出力ウィンドウで例外を見ることができますが、問題は私がUIでそれを見ることができず、クラッシュしないということです。

例外はどこに行きましたか?

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

おそらくこのコードにいくつかのコードを共有したいと思うでしょう – AlexCuse

答えて

10

私はインターネットでこの説明を見つけた:

でも同じアプリケーション内のドラッグアンドドロップで、ドラッグアンドドロップは、標準のOLEドラッグアンドドロップ機構を介して処理されます。 OLEの観点からは、ソースとターゲットの2つのアプリケーションを扱い、それらを適切に切り離します。 OLEは.NETよりもはるかに長いため、OLEには.NET例外の概念がないため、ターゲットからソースに例外を伝達することはできません。できる場合であっても、ターゲットがドロップを実行できないというソース管理はなぜ必要ですか? DragDropイベント中に例外を処理するには、DragDropイベントハンドラ内で例外を処理する必要があります。ソースとターゲットの間で管理対象から管理対象外のコードへの移行が管理されているため、イベントハンドラを超えて伝播しません。

質問の後に1番目の答えhereを参照してください。

+0

ありがとう、非常に興味深い投稿 –

0

例外は、おそらくどこかにバックグラウンドスレッドで発生している:ここで

問題について説明し、いくつかのコードがあります。 AppDomain.CurrentDomain.UnhandledExceptionまたはApplication.ThreadExceptionイベントのハンドラーを作成する必要があります。

詳細はhereを参照してください。

+0

私は両方のハンドラを作成しましたが、いずれのコードにも例外は表示されません。他に何かありますか? –

+0

ビジュアルスタジオで、[デバッグ] - > [例外]を押し、 "共通言語ランタイム例外"の横にある "投げられた"ボックスをチェックします。これにより、例外がスローされるとすぐにデバッガがコードに分割され、F10/F11を使用してそのパスに沿って歩くことができます。 –

関連する問題