C#Winform项目
我有一个带有contextMenu的dataGridView。简单地说一切都按照我想要的方式工作,除非上下文菜单选择触发,即使我不想要它(当我点击时)。 例如,我右键单击我的dataGridView,我看到了我的选择。如果我选择它,它会触发MouseClick事件并执行我想要的操作。但是,如果我点击它,它会触发MouseClick事件。
我在OnMouseUp事件中以几种不同的方式尝试过它,但同样的情况也是如此。你会注意到一些额外的"如果""在下面的代码中基本上是我尝试了一些事情来让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.
}
}
当我点击时,我错过了告诉我的应用程序不会触发的内容?
谢谢,
~Chris
答案 0 :(得分:0)
发生的事情是,一旦ContextMenu关闭,您的方法将继续处理。要修复您的解决方案,您只需在为您的ContextMenu调用return
后Show
。
简单修复:
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));
}
}
}
关键是将EventHandler添加到ContextMenu的MenuItem中。希望有所帮助!