仅当未单击任何项目时才在列表视图上打开上下文菜单
Opening a contextmenu on a listview only if NO item has been clicked
感谢 Whosebug 上的许多答案,我们都知道如何在右键单击列表视图中的项目时打开上下文菜单。即:
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);
}
}
}
我的目标是当用户在列表视图中单击但没有单击某个项目而是空 space 时打开另一个(不同的)上下文菜单。 (点击列时最好不要触发header)
我的第一个想法是测试上面提到的 tmp_SelectedItem 是否为 null,因此没有项目。然而,当我插入 else 案例并将其切换时:
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,但是它只打开了 contextMenuStripNoItem,无论在什么地方或什么地方我在 listView 中单击。另外,我尝试在单击一个项目时关闭分配的 contextMenuStrip,而不是打开另一个。也没用。
我真的不明白为什么它不适用于前两种方法,所以经过一些研究确认没有关于这个的教程或论坛上已经存在的问题(至少据我搜索并理解),我决定求助于 Whosebug。
提前致谢:)
试试这个代码片段
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
if (listView1.SelectedItems.Count > 0)
e.Cancel = true;
}
试试这个(我稍微改变了逻辑,如果你点击一个项目,它将被选中,所以你不需要检查 X 和 Y 位置。如果选中;显示 menustrip1 ,如果没有;那么没有对项目执行右键单击,显示 menustrip2)。您可以使用 Mouse_Up
事件触发整个 listbox
鼠标事件。 Mouse_Click
仅在物品被击中时有效。
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
ListView tmp_SenderListView = sender as ListView;
if (e.Button == MouseButtons.Right)
{
if (tmp_SenderListView.SelectedItems.Count > 0)
{
contextMenuStrip1.Show(tmp_SenderListView, e.Location);
}
else
{
contextMenuStrip2.Show(tmp_SenderListView, e.Location);
}
}
}
希望有所帮助,
感谢 Whosebug 上的许多答案,我们都知道如何在右键单击列表视图中的项目时打开上下文菜单。即:
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);
}
}
}
我的目标是当用户在列表视图中单击但没有单击某个项目而是空 space 时打开另一个(不同的)上下文菜单。 (点击列时最好不要触发header)
我的第一个想法是测试上面提到的 tmp_SelectedItem 是否为 null,因此没有项目。然而,当我插入 else 案例并将其切换时:
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,但是它只打开了 contextMenuStripNoItem,无论在什么地方或什么地方我在 listView 中单击。另外,我尝试在单击一个项目时关闭分配的 contextMenuStrip,而不是打开另一个。也没用。
我真的不明白为什么它不适用于前两种方法,所以经过一些研究确认没有关于这个的教程或论坛上已经存在的问题(至少据我搜索并理解),我决定求助于 Whosebug。
提前致谢:)
试试这个代码片段
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
if (listView1.SelectedItems.Count > 0)
e.Cancel = true;
}
试试这个(我稍微改变了逻辑,如果你点击一个项目,它将被选中,所以你不需要检查 X 和 Y 位置。如果选中;显示 menustrip1 ,如果没有;那么没有对项目执行右键单击,显示 menustrip2)。您可以使用 Mouse_Up
事件触发整个 listbox
鼠标事件。 Mouse_Click
仅在物品被击中时有效。
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
ListView tmp_SenderListView = sender as ListView;
if (e.Button == MouseButtons.Right)
{
if (tmp_SenderListView.SelectedItems.Count > 0)
{
contextMenuStrip1.Show(tmp_SenderListView, e.Location);
}
else
{
contextMenuStrip2.Show(tmp_SenderListView, e.Location);
}
}
}
希望有所帮助,