代码之家  ›  专栏  ›  技术社区  ›  Arne Peirs

单击列标题时,会显示ListView中的ContextMenu

  •  1
  • Arne Peirs  · 技术社区  · 6 年前

    我制作了一个列表视图和一个上下文菜单,当我右键单击列表视图时会弹出。问题是,当右键单击标题时,它也会弹出。我希望它只在我右键单击某个项目时弹出。

    我已经试过回答关于这个特定问题的其他问题,但它们对我不起作用。

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

    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
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Reza Aghaei    6 年前

    设置 FullRowSelect true . 然后处理 MouseClick 事件并检查是否单击了鼠标右键,执行点击测试,如果鼠标下有项目,请首先选择它,然后显示 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);
        }
    }
    
        2
  •  0
  •   Caius Jard    6 年前

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