因此,感谢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。
提前致谢:)
答案 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
希望有所帮助,