返回

datagridview右键没有数据的地方不显示contextMenuStrip

2024-02-05 datagridview 右键 contextMenuStrip 1282 0

在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 的显示
    }
}
顶部