仅当未单击任何项​​目时才在列表视图上打开上下文菜单

时间:2016-09-12 15:43:22

标签: c# listview contextmenu

因此,感谢stackoverflow上的许多答案,我们都知道如何在右键单击列表视图中的项目时打开上下文菜单。即:

private void listviewItems_MouseClick(object sender, MouseEventArgs e) {
    ListView tmp_SenderListView = sender as ListView;
    if (e.Button == MouseButtons.Right) {
        ListViewItem tmp_SelectedItem = tmp_SenderListView.GetItemAt(e.X, e.Y);
        if (tmp_SelectedItem != null) {
            tmp_SelectedItem.Selected = true;
            contextMenuStripItem.Show(tmp_SenderListView, e.Location);
        }
    }
}

我的目标是在用户点击列表视图内部时打开另一个(不同的)上下文菜单但不点击某个项目而是点击空白区域。 (最好在点击列标题时不触发)

我的第一个想法是测试上面提到的 tmp_SelectedItem 是否 null ,因此没有项目。然而,当我这样做时插入了else case并将其切换:

private void listviewItems_MouseClick(object sender, MouseEventArgs e) {
    ListView tmp_SenderListView = sender as ListView;
    if (e.Button == MouseButtons.Right) {
        ListViewItem tmp_SelectedItem = tmp_SenderListView.GetItemAt(e.X, e.Y);
        if (tmp_SelectedItem == null) {
            contextMenuStripNoItem.Show(tmp_SenderListView, e.Location);
        }
        else {
            tmp_SelectedItem.Selected = true;
            contextMenuStripItem.Show(tmp_SenderListView, e.Location);
        }
    }
}

它没有用,只是还没有打开任何东西。 我再次尝试,这次打开 contextMenuStripNoItem ,然后我测试是否已经点击了一个项目,如果是这种情况, contextMenuStripNoItem 将被关闭, contextMenuStripItem 会打开。这也不起作用。

我尝试将 contextMenuStripNoItem 设为listView的主要contextMenuStrip,然后无论我在listView中点击的位置或内容,它都只打开 contextMenuStripNoItem 。另外,我尝试在单击某个项目时关闭指定的contextMenuStrip,而是打开另一个项目。也没用。

我真的不明白为什么它没有使用前两种方法,所以经过一些研究确认在论坛上没有这个或已经存在的问题的教程(至少到目前为止)我搜索并理解了),我决定转向stackoverflow。

提前致谢:)

2 个答案:

答案 0 :(得分:1)

试试此代码段

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
            e.Cancel = true;

    }

答案 1 :(得分:0)

试试这个(我改变了一点逻辑,如果你点击一个项目,它会被选中,所以你不需要检查X和Y位置。如果选中;显示 menustrip1 ,如果没有;所以右键单击没有对项目执行,显示 menustrip2 )。您可以使用val.ragb事件来触发所有Mouse_Up鼠标事件。 listbox仅在项目被击中时才有效。

Mouse_Click

希望有所帮助,