当点击离开仍然触发上下文菜单
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.
}
}
缺少什么我要告诉我的应用程序,当我点击即可不触发?
感谢,
〜克里斯
发生了什么事是你的方法继续一旦文本菜单关闭处理。要为您的ContextMenu调用Show
,只需要return
。
简单的解决方法:
m.Show(dgvMyDataGridView, new Point(e.X, e.Y));
return;
的问题是事件处理程序的执行仍在继续,只是在等待m.Show
“结束”时,上下文菜单关闭,类似的方式,Form.ShowDialog
和MessageBox.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));
}
}
}
的关键是添加事件处理程序到你的文本菜单的菜单项。希望有所帮助!
我相信你会找到一些东西。奇怪的是,它曾经工作过一次,但由于某种原因没有在那之后。我整天都在弄乱我的代码,在某些时候我可能会破坏某些东西。我很亲密,我不想重做一切,所以我坚持下去,并相信我解决了我的问题。我需要做的是通过contextMenu创建一个事件处理程序,而不是使用dgvMyDataGridView_MouseClick事件。对于这样的记录:m.MenuItems.Add(“&Do Something”,new EventHandler(EventToCallHere));然后,我设置了一个活动来完成我想要的事情。我非常感谢你的帮助。 – Chris 2012-07-25 21:06:21
@Chris啊,所以你说你的MouseClick处理程序的第二部分是ContextMenu的预期结果?这是一个关键点,我会更新我的答案以包含该修复,以供稍后搜索类似问题的任何人使用。 – 2012-07-26 15:43:22
不要这样创建上下文菜单,创建一个静态上下文菜单,然后设置'dgvMyDataGridView.ContextMenu = m;' – 2012-07-25 17:02:31
@HansZ他会希望它是静态的吗?有可能(可能不是他的情况)可以多次实例化表单,然后单击任何表单上的菜单将触发所有附加的处理程序,对吗?会不会只是一个正式的成员变量的形式要走的路?或者甚至为DataGridView设置ContextMenu属性,然后重新使用它? – 2012-07-25 18:46:32
诚实地说,我不会重新记住为什么我动态创建它。我相信这与我必须创建一个动态构建的ContextMenu(我有一个程序员的头脑,但抱歉,我不像你们那样有经验)的认识有关。无论如何,我是如此亲密,我不想重做一切,所以我坚持下去,并相信我解决了我的问题。我需要做的是通过contextMenu创建一个事件处理程序,而不是使用dgvMyDataGridView_MouseClick事件。感谢您的所有输入。 – Chris 2012-07-25 19:53:10