最近程式裡發現一個問題,在列表裡快顯功能表(ContextMenuStrip),並選擇某一項後,菜單一直顯示,並且一直等待菜單事件處理的完成,嚴重的是,有時候,即便功能表項目的事件完成了,菜單仍然不會自動關掉。切換程式後,菜單仍然顯示著,只有回到應用程式介面,再次用滑鼠點一下菜單所屬於的列表,菜單才消失掉。我把出現該問題的代碼寫法貼出來:
//公用部分
//declaration
private ContextMenuStrip contextMenuStrip ;
//initialization
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip";
this.contextMenuStrip1.Size = new System.Drawing.Size(125, 76);
//寫法 - 1
//add ItemClicked event
contextMenuStrip.ItemClicked += new ToolStripItemClickedEventHandler(contextMenuStrip_ItemClicked);
private void contextMenuStrip_ItemClicked(object sender,ToolStripItemClickedEventArgs e)
{
if(e.ClickedItem == addToolStripMenuItem)
{
Thread.Sleep(2000);
MessageBox.Show("ok.");
}
}
按照上面的寫法,在彈出的菜單中選擇一項後,在選擇後的執行過程中,菜單一直伴隨執行過程而顯示著,即便切換進程/應用程式,菜單一直都會顯示。
如果按照如下寫法,那麼上面的問題就不會出現了,一點菜單,菜單馬上消失,隨後執行功能表項目的處理過程。
寫法如下:
//寫法 - 2
addToolStripMenuItem.Click += new EventHandler(addToolStripMenuItem_Click);
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
Thread.Sleep(2000);
MessageBox.Show("ok.");
}
這個寫法,就是把菜單的事件加到菜單的每個項上,而上面的寫法是把菜單事件增加到菜單上,然後在該事件裡來判斷是那個功能表項目,然後再做處理。這就是兩種寫法的區別,顯然,寫法上的區別造成了菜單顯示上的區別,以及上一種寫法所存在的問題。在我本地的測試中,沒有發現菜單不能關閉的問題,但是在我們的產品上,卻發現了該問題,問題仍然在繼續尋找中。。。