1

これは奇妙な行動のケースです。
イベントを呼び出してTreeView_Drag_Dropいます (イベントの種類は関係ないと思いますが、なんでも構いません)。MessageBoxイベント内で、3 連続で呼び出します。このような :

MessageBox.Show("A");
MessageBox.Show("B");
MessageBox.Show("C");

出力は と にBなりCます。ブレークポイントを設定するMessageBox.Show("A");と、そこで停止しますが、MessageBox.
これのコードを置き換えると:

Console.WriteLine("A");
MessageBox.Show("B");
MessageBox.Show("C");

出力はこれA (in the console)になります、、、。BC

私の最後の試みは、ダミーMessageBoxを作成して、コンパイラーが最初に見たボックスのみを除外するかどうかを確認することです。だから私はこれのために私のコードを置き換えました:

MessageBox.Show("Kill this box");
MessageBox.Show("A");
MessageBox.Show("B");
MessageBox.Show("C");

出力はA, B,Cです。

これ以上のコードなしで簡単な説明はありますか? (とにかく、それがイベントの唯一のコードです) この動作を説明できないからです。


別のテストで更新する

に入れてみましたforeach loop

foreach ( // logic )
{
  MessageBox.Show("A");
  MessageBox.Show("B");
  MessageBox.Show("C");
}

私の最初の反復では、出力は , になりBますC
しかし、他のすべての反復では、出力はA, B, になりCます。すでに除外されているMessageBoxように、通過しても問題ありません。


コードの更新

このコードは、プロトタイプで完全に機能します。しかし、まったく同じコードが私のプログラムにはありません。
多言語サポートなどの場合、フォームはリフレクションによって呼び出されることに注意してください。(それはまったく関係ないと思いますが、とにかく)。

    private void Form1_Load(object sender, EventArgs e)
    {
        treeView1.Nodes.Add("Test");
        this.treeView1.ItemDrag += new ItemDragEventHandler(this.treeView_ItemDrag);
        this.treeView2.ItemDrag += new ItemDragEventHandler(this.treeView_ItemDrag);
        this.treeView1.DragEnter += new DragEventHandler(this.treeView_DragEnter);
        this.treeView2.DragEnter += new DragEventHandler(this.treeView_DragEnter);
        this.treeView1.DragDrop += new DragEventHandler(this.treeView_DragDrop);
        this.treeView2.DragDrop += new DragEventHandler(this.treeView_DragDrop);
    }

    private void treeView_DragEnter(object sender,
        System.Windows.Forms.DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

    private void treeView_ItemDrag(object sender,
        System.Windows.Forms.ItemDragEventArgs e)
    {
        DoDragDrop(e.Item, DragDropEffects.Move);
    }

    private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {

        MessageBox.Show("A");
        MessageBox.Show("B");
        MessageBox.Show("C");

    }

私はそれが機能することを知っています。問題は、それが私のプログラムになく、まったく同じコードであることです。私のソリューションで動作が異なる可能性のある理由を探していますが、何も見つかりません。

4

1 に答える 1

1

DragAndDrop event

それらで発生した例外は、診断なしで飲み込まれます。その背後にある可能性のある哲学は、別のプログラムによって生成されたデータを処理するため、失敗する可能性が高いということです。そして、そのような悪いデータを生成するバグのあるプログラムは、あなたのプログラムをクラッシュさせるべきではありません.

コードをデバッグする必要がある場合は、Debug + Exceptions を使用し、CLR 例外の Thrown チェックボックスをオンにします。例外がスローされるとデバッガーが停止するようになりました。

ユーザーに例外を知らせたい場合は、try/catch を使用して、飲み込まれる前に例外をキャッチする必要があります。別のプログラムのバグがあなたの説明になるというわずかなリスクがあります。

同様の質問でこれを見つけました。最後に..この動作はデバッグが非常に困難です。

于 2012-12-19T00:37:48.123 に答える