2012-07-25 43 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

相关问题