2017-03-17 85 views
0

所以我有一個表格DataGridView,當我在網格上點擊右鍵時,我想顯示一個菜單項中有一個菜單項的上下文菜單。該菜單項將打開第二個窗體,爲DataGridView提供一些配置選項。WinForms ContextMenu在MenuItem被點擊時保持打開狀態

現在所有這些工作都非常好,上下文菜單正確顯示,並且第二個窗體可以正確打開,並且該窗體上的所有功能都能正常工作。

唯一的問題是,只有當我點擊菜單項以外的任何地方時,上下文菜單纔會關閉。無論我點擊菜單項多少次,上下文菜單都不會關閉。

我試過尋找解決方法,但據我所知,沒有辦法以編程方式關閉上下文菜單。

任何幫助將不勝感激。以下是用於打開上下文菜單和菜單項點擊事件的點擊事件的副本。

private void DataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     DataGridView dgv = (DataGridView)sender; 
     if (dgv.CurrentCell == null) 
     { 
      return; 
     } 
     else 
     { 
      Rectangle r = dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); 
      Point p = new Point(r.X + e.X, r.Y + e.Y); 
      ContextMenu cm = new ContextMenu(); 
      cm.MenuItems.Add(new MenuItem("Item", Item_Click)); 
      cm.Show(dgv, p); 
     } 
    } 
} 

private void Item_Click(object sender, EventArgs e) 
{ 
    new SecondForm().Show(); 
} 

更新: 我用了的ContextMenuStrip類替換ContextMenu類,取出鼠標點擊事件處理和分配的ContextMenuStrip對象DataGridView.ContextMenuStrip解決的問題。看起來好像ContextMenuStrip類處理顯示菜單,當相關的控件被右鍵單擊時,所以如果添加一個單擊事件處理程序來處理打開菜單,它會反覆嘗試渲染菜單,使其閃爍幾次最終呈現

+0

你的代碼中沒有任何地方試圖隱藏上下文菜單。我會嘗試做點什麼,但是你應該保存對你在表單中創建的ContextMEnu的引用,或者你可以使用'sender'變量,將它作爲ContextMenu轉換,然後嘗試Hide()。 –

+0

@GuillaumeCR我已經嘗試過各種方法來隱藏上下文菜單,但似乎沒有一種隱藏函數要調用或設置可見性屬性。在以前的應用程序中,當菜單項被點擊時,我已經建立了自動關閉的上下文菜單我無法弄清楚爲什麼它不這樣做 – ltw1991

+0

很難猜測*其他*代碼可能導致CMS的行爲如何。總是先嚐試一下你自己發佈的片段,以驗證它仍然以相同的方式行事不端。隨意選擇CellMouseUp事件和ContextMenuStrip類。 –

回答

0

在你的類添加了你的上下文菜單的私有變量

private bool CloseMenu = true; 
鼠標

private void Item_Click(object sender, EventArgs e) 
{ 
    CloseMenu = false; 
    new SecondForm().Show(); 
} 

添加上下文菜單關閉事件

private void contextMenuStripMy_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
{ 
    e.Cancel = !CloseMenu; 
    CloseMenu = true; 
} 
+0

所以當我創建我的菜單項如下: 'cm.MenuItems。Add(new MenuItem(「Item」,Item_Click));' 我用關閉事件方法調用替換Item_Click方法調用並將舊方法的內容放在關閉事件方法的開始? – ltw1991

相關問題