2012-12-14 33 views
1

這是一個奇怪行爲的情況。
我打電話給TreeView_Drag_Drop事件(我不認爲事件的類型是相關的,但無論如何)。在我的活動中,我連續致電3 MessageBox。就像這樣:調用事件跳過消息框

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)BC

我最後的嘗試是製作一個虛擬MessageBox來查看編譯器是否僅排除他所看到的第一個框。所以我代替我這個代碼:

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

輸出爲ABC

有沒有簡單的解釋,沒有任何進一步的代碼? (無論如何,這是事件中唯一的代碼),因爲我無法解釋這種行爲。


更新與另一個測試

我試圖把它們放在一個foreach loop

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

對於我的第一次迭代,輸出將是BC
但是對於所有其他迭代,輸出將是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"); 

    } 

我知道它的工作原理。問題是它沒有在我的程序中,它是完全相同的代碼。我正在尋找任何可能的原因,爲什麼它會在我的解決方案中表現不同,但我找不到任何東西。

+0

這是否僅在此特定事件中發生? – Blachshma

+0

不,我在很多其他事件上嘗試過,只是爲了確保它不是事件調用的問題。 – phadaphunk

+0

如果您正在全速前進或全速運行,它會產生什麼影響嗎?它重新啓動後能存活嗎? – PeteH

回答

1

DragAndDrop event

在他們所提出的任何異常吞嚥,沒有任何診斷。這背後的可能的哲學是,他們可能會失敗,因爲他們處理由另一個程序產生的數據。而且一個產生這樣的不良數據的錯誤程序不應該讓你崩潰。

如果您需要調試代碼,然後使用Debug + Exceptions,請勾選Thrown複選框以查看CLR異常。當拋出異常時,調試器現在停止。

如果你想讓用戶知道任何異常,那麼你需要使用try/catch來捕獲異常,然後才能被吞下。由於其他程序中的任何錯誤成爲你的解釋的風險很小。

我發現在類似的問題上。最後..這種行爲很難調試。