【问题标题】:ContextMenu in ListView shows up when clicking on column headers单击列标题时会显示 ListView 中的 ContextMenu
【发布时间】:2017-11-26 22:31:53
【问题描述】:

我创建了一个 ListView 和一个在我右键单击 ListView 时弹出的 ContextMenu。问题是右键单击标题时它也会弹出。我希望它只在我右键单击某个项目时弹出。

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

这是我添加的 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
}

【问题讨论】:

  • 您能否解释一下您所查看的答案中哪些具体不起作用?另外我建议使用 Opening 事件处理程序来取消上下文菜单的打开。
  • 我尝试使用BoundsFocusedItemSelectedItems,...但所有这些仍然让右键菜单显示在标题上。
  • 奇怪,如果我单击 ListView 的标题,我无法获得 MouseDown 事件。
  • 你能用 var item = ListView1.GetItemAt(e.X, e.Y); 代替 HitTest 吗?
  • 我试过了,点击标题还是会弹出

标签: c# .net winforms listview contextmenu


【解决方案1】:

FullRowSelect 设置为true。然后处理MouseClick事件,检查鼠标右键是否被点击,执行hit-test,如果鼠标下有项目,先选中它,然后以这种方式显示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);
    }
}

【讨论】:

  • 如果您在应用该解决方案时遇到任何问题,请告诉我。
  • 这对我不起作用。这也是我在寻找这个问题时找到的答案之一。
  • 我测试了它,它工作正常。可能您没有复制代码,也没有在干净的环境中进行测试。在干净的环境中尝试并复制确切的代码以查看结果。注意是MouseClick 事件。
  • 我复制了代码并将我的事件从MouseDown 更改为MouseClick,但它仍然不起作用。
  • 不起作用是什么意思?不显示菜单?不选择项目?发生什么了?您确定将事件处理程序附加到事件吗?证明它在干净的环境中工作很简单......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多