1

这是一个奇怪的行为案例。
我正在调用一个TreeView_Drag_Drop事件(我不认为事件的类型是相关的,但无论如何)。在我的活动中,我MessageBox连续调用 3 个。像这样 :

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

输出将是BC。如果我在上面设置断点,MessageBox.Show("A");它将停在那里但不会弹出MessageBox.
如果我为此替换我的代码:

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

输出将是这个A (in the console), B, C

我最后一次尝试是做一个假人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 回答