如何限制右键单击选定的列表视图项目或项目而不是空格

本文关键字:项目 空格 视图 列表 右键 何限制 单击 | 更新日期: 2023-09-27 18:20:08

在列表视图项中单击鼠标右键可以工作,但它可以在列表视图中的每个空间上工作,无论是在项上还是在空格上。我只想限制到选定的项目。

我试着使用listview1.HitTest,但它不起作用。仍然右键单击是所有列表。

if (e.Button == MouseButtons.Right)
        {
            var loc = listView1.HitTest(e.Location);
            if (loc.Item != null && contextMenuStrip1.Items.Count == 0)
            {
                contextMenuStrip1.Items.Add("TEST1");
                contextMenuStrip1.Items.Add("TEST2");
            }              
        }

如何限制右键单击选定的列表视图项目或项目而不是空格

如果HitTest显示鼠标未在项目上,则可以取消ContextMenuStrip.Opening事件。

这里没有事件参数中的鼠标位置,所以必须从Control.MousePosition 中获取

public void ContextMenuOpening(object sender, CancelEventArgs e) {
  Point mousePosition = myListView.PointToClient(Control.MousePosition);
  ListViewHitTestInfo hit = myListView.HitTest(mousePosition);
  e.Cancel = hit.Item == null;
}

您仍然可以在listView1_mouseDown()中进行测试;我这样做了,它运行得很好,从而避免了与ContextMenuOpeningControl.MousePosition的麻烦。唯一的区别是,我将lvhti声明为ListViewHitTestInfo,而不是var:

if (e.Button == MouseButtons.Right)
{
  ListViewHitTestInfo lvhti = this.listView1.HitTest(e.X, e.Y); // or e.Location
  if (lvhti.Item != null){
        contextMenuStrip1.Show(this.listView1, new Point(e.X, e.Y));
  }              
}