单击列 headers 时显示 ListView 中的上下文菜单

ContextMenu in ListView shows up when clicking on column headers

我制作了一个 ListView 和一个右键单击 ListView 时弹出的 ContextMenu。问题是当右击 headers 时它也会弹出。我想让它做的是只在我右键单击一个项目时弹出。

我已经尝试过有关此特定问题的其他问题的答案,但它们对我不起作用。

这是我添加的ListView。菜单应该只显示在项目上。

这是我的代码:

public GUIMod CreateList
{
    set
    {
        ListView1.Items.Clear();

        bool latestCompatibleVersionAlreadyFound = false;
        ListView1.Items.AddRange(AllVersions.Select(module =>
        {
            ListViewItem item = new ListViewItem();
            if (module.IsCompatible(versionCriteria))
            {
                if (!latestCompatibleVersionAlreadyFound)
                {
                    latestCompatibleVersionAlreadyFound = true;
                    item.BackColor = Color.Green;
                    item.ForeColor = Color.White;
                }
                else
                {
                    item.BackColor = Color.LightGreen;
                }
            }

            if (installedVersion != null && installedVersion.IsEqualTo(module.version))
            {
                item.Font = new Font(item.Font, FontStyle.Bold);
            }

            item.Text = module.version.ToString();
            item.SubItems.Add(module.HighestCompatibleVersion());
            return item;
        }
        ).ToArray());
    }
}

private void ListView1_MouseDown(object sender, MouseEventArgs e)
{
    var item = ListView1.HitTest(e.X, e.Y).Item;

    if (e.Button == MouseButtons.Right)
    {
        if (item != null)
        {
            // Show the right click menu
            ContextMenuStrip1.Show(ListView1, new Point(e.X, e.Y));

            if (installedVersion != null && AllVersions[item.Index].version.IsEqualTo(installedVersion))
            {
                // Item is darkgreen, disable option
                ToolstripMenuItem1.Enabled = false;
            }
            else if (!AllVersions[item.Index].IsCompatible(versionCriteria))
            {
                // Item is white, disable option
                ToolstripMenuItem1.Enabled = false;
            }
            else
            {
                // Item is installable, enabe option
                ToolstripMenuItem1.Enabled = true;
            }
        }
    }
}

private void ToolstripMenuItem1_Click(object sender, EventArgs e)
{
    // Nothing yet
}

MouseDown(我更喜欢用 mouseup 显示上下文菜单)事件有一个 MouseEventArgs 参数,其中 属性 是鼠标被点击的位置。这可以用来确定他的鼠标在哪里,即它是否在 header 中,如果是,则取消 mouseup evwnt。鼠标的位置可能是相对于列表框控件或窗体本身指定的,因此请检查并相应地调整逻辑(我不记得它使用的是哪个坐标系)

FullRowSelect 设置为 true。然后处理 MouseClick 事件并检查是否单击了鼠标右键,执行命中测试,如果鼠标下方有项目,则首先 select 然后显示 ContextMenuStrip这样:

private void listView1_MouseClick(object sender, MouseEventArgs e)
{
    if(e.Button== MouseButtons.Right)
    {
        var hti = listView1.HitTest(e.Location);
        if (hti.Item != null)
            hti.Item.Selected = true;

        contextMenuStrip1.Show(listView1, e.Location);
    }
}