在Winform中,可以使用下面的代码为DataGridView绑定右键菜单:
this.dataGridView1.ContextMenuStrip = contextMenuStrip2;
但是实际使用中发现如果DataGridView还没有绑定数据,界面是空白的时候右键也会显示菜单。那么怎么样才能在datagridview右键没有数据的地方不显示contextMenuStrip呢?
网上查了很多做法,都是在dataGridView1_MouseDown或者dataGridView1_CellMouseDown事件中根据当前点击RowIndex是否大于0来判断有没有右键点击到数据行。例如下面的代码,实际上是不生效的,点击了空白部分仍然会显示菜单。
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
// 获取右键点击的单元格坐标
DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
// 如果点击的位置不在有效的单元格范围内,则不显示菜单
if (hit.RowIndex == -1 || hit.ColumnIndex == -1)
{
dataGridView1.ContextMenuStrip?.Hide();
}
}
}
正确的做法是使用 ContextMenuStrip 的 Opening 事件,在该事件中判断是否点击数据上,如果不是就通过设置e.Cancel = true来取消 ContextMenuStrip 的显示:
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
Point mousePos = dataGridView1.PointToClient(Control.MousePosition);
DataGridView.HitTestInfo hitTest = dataGridView1.HitTest(mousePos.X, mousePos.Y);
if (hitTest.Type == DataGridViewHitTestType.None)
{
e.Cancel = true; // 取消 ContextMenuStrip 的显示
}
}
3