2012-07-25 49 views
0

C#Winform項目當點擊離開仍然觸發上下文菜單

我有一個contextMenu的dataGridView。簡單地說,一切都按照我想要的方式工作,除了上下文菜單選擇會觸發,即使我不想要它(當我點擊時)。 例如我右鍵單擊我的dataGridView我看到我的選擇。如果我選擇它,它會觸發一個MouseClick事件並執行我想要的操作。但是,如果我點擊它,它會觸發MouseClick事件。

我在一個OnMouseUp事件中以幾種不同的方式嘗試過它,但同樣的事情正在發生。在下面的代碼中你會注意到一些額外的「if」,基本上我嘗試了一些讓MouseClick不必觸發的事情(最終我相信它只是在做冗餘工作)。

在下面的代碼請注意下面這個:MessageBox.Show(「這裏出事了!」);

代碼:

private void dgvMyDataGridView_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     currentMouseOverCol = dgvMyDataGridView.HitTest(e.X, e.Y).ColumnIndex; 
     currentMouseOverRow = dgvMyDataGridView.HitTest(e.X, e.Y).RowIndex; 

     ContextMenu m = new ContextMenu(); 
     if (currentMouseOverRow >= 0 && currentMouseOverCol == 1) 
     { 
      dgvMyDataGridView.CurrentRow.Cells[0].Value.ToString()))); 
      m.MenuItems.Add(new MenuItem(string.Format("Do something with this row"))); 
     } 

     m.Show(dgvMyDataGridView, new Point(e.X, e.Y)); 
    } 

    DataGridView.HitTestInfo hitTestInfo; 
    hitTestInfo = dgvMyDataGridView.HitTest(e.X, e.Y); 

    if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 1 && currentMouseOverRow >= 0 && currentMouseOverCol == 1) 
    { 
     MessageBox.Show("something goes wrong here!"); 
     // Code to open a new form page - this all works. 
    } 
} 

缺少什麼我要告訴我的應用程序,當我點擊即可不觸發?

感謝,

〜克里斯

+2

不要這樣創建上下文菜單,創建一個靜態上下文菜單,然後設置'dgvMyDataGridView.ContextMenu = m;' – 2012-07-25 17:02:31

+0

@HansZ他會希望它是靜態的嗎?有可能(可能不是他的情況)可以多次實例化表單,然後單擊任何表單上的菜單將觸發所有附加的處理程序,對嗎?會不會只是一個正式的成員變量的形式要走的路?或者甚至爲DataGridView設置ContextMenu屬性,然後重新使用它? – 2012-07-25 18:46:32

+0

誠實地說,我不會重新記住爲什麼我動態創建它。我相信這與我必須創建一個動態構建的ContextMenu(我有一個程序員的頭腦,但抱歉,我不像你們那樣有經驗)的認識有關。無論如何,我是如此親密,我不想重做一切,所以我堅持下去,並相信我解決了我的問題。我需要做的是通過contextMenu創建一個事件處理程序,而不是使用dgvMyDataGridView_MouseClick事件。感謝您的所有輸入。 – Chris 2012-07-25 19:53:10

回答

0

發生了什麼事是你的方法繼續一旦文本菜單關閉處理。要爲您的ContextMenu調用Show,只需要return

簡單的解決方法:

m.Show(dgvMyDataGridView, new Point(e.X, e.Y)); 
return; 

的問題是事件處理程序的執行仍在繼續,只是在等待m.Show「結束」時,上下文菜單關閉,類似的方式,Form.ShowDialogMessageBox.Show表現。

更新:從評論,它看起來像DataGridView.MouseClick試圖處理用戶點擊ContextMenu的項目。在這種情況下,你需要對代碼做較大的改變,如下圖所示:

private void dgvMyDataGridView_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     var hitTestInfo = dgvMyDataGridView.HitTest(e.X, e.Y); 

     if ((hitTestInfo.Type == DataGridViewHitTestType.Cell) && 
      (hitTestInfo.ColumnIndex == 1) && 
      (hitTestInfo.RowIndex >= 0)) 
     { 
      string currentCell = dgvMyDataGridView.Rows[hitTestInfo.RowIndex].Cells[hitTestInfo.ColumnIndex].Value.ToString(); 
      ContextMenu m = new ContextMenu(); 
      dgvMyDataGridView.CurrentRow.Cells[0].Value.ToString(); 
      m.MenuItems.Add(new MenuItem("Click Me!", new EventHandler((itemSender, itemEvent) => 
      { 
       var result = MessageBox.Show("You've clicked " + currentCell + ". Open next form?", "Continue?", MessageBoxButtons.YesNo); 
       if (result == System.Windows.Forms.DialogResult.Yes) 
       { 
        // Code to open a new form page. 
       } 
      }))); 
      m.Show(dgvMyDataGridView, new Point(e.X, e.Y)); 
     } 
    } 
} 

的關鍵是添加事件處理程序到你的文本菜單的菜單項。希望有所幫助!

+0

我相信你會找到一些東西。奇怪的是,它曾經工作過一次,但由於某種原因沒有在那之後。我整天都在弄亂我的代碼,在某些時候我可能會破壞某些東西。我很親密,我不想重做一切,所以我堅持下去,並相信我解決了我的問題。我需要做的是通過contextMenu創建一個事件處理程序,而不是使用dgvMyDataGridView_MouseClick事件。對於這樣的記錄:m.MenuItems.Add(「&Do Something」,new EventHandler(EventToCallHere));然後,我設置了一個活動來完成我想要的事情。我非常感謝你的幫助。 – Chris 2012-07-25 21:06:21

+0

@Chris啊,所以你說你的MouseClick處理程序的第二部分是ContextMenu的預期結果?這是一個關鍵點,我會更新我的答案以包含該修復,以供稍後搜索類似問題的任何人使用。 – 2012-07-26 15:43:22

相關問題