显示ListView中项目的上下文菜单

现在, 拜托 ,我知道如何在我右键单击listView时弹出一个contextMenu,我想要的是当我右键单击一个项目时弹出它。 我正在尝试建立一个聊天服务器和客户端,现在……现在我想在我右键单击连接的客户端项目时查看客户端信息。 现在我该怎么做?

谢谢!

private void listView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (listView1.FocusedItem.Bounds.Contains(e.Location)) { contextMenuStrip1.Show(Cursor.Position); } } } 

您可以将连接的客户端信息放在contextMenuStrip1中。 当您右键单击某个项目时,您可以显示该contextMenuStrip1中的信息。

您将不得不使用ListViews上下文菜单,但根据您右键单击的ListView项目进行更改。

 private void listView1_MouseDown(object sender, MouseEventArgs e) { bool match = false; if (e.Button == System.Windows.Forms.MouseButtons.Right) { foreach (ListViewItem item in listView1.Items) { if (item.Bounds.Contains(new Point(eX, eY))) { MenuItem[] mi = new MenuItem[] { new MenuItem("Hello"), new MenuItem("World"), new MenuItem(item.Name) }; listView1.ContextMenu = new ContextMenu(mi); match = true; break; } } if (match) { listView1.ContextMenu.Show(listView1, new Point(eX, eY)); } else { //Show listViews context menu } } } 

您可以触发ListView MouseDownMouseUp事件,其中如果MouseButton.Right然后使用ListView.Hittest获取所选项目,并提供与该选定项目相关的上下文菜单。

有关更清晰的信息,您可以浏览此链接

这个话题很老了,但我会留下我的解决方案供参考。

在xaml ListView定义中放置上下文菜单:

        ...  

现在,在代码中,定义两个事件处理程序,将在单击相应的菜单项时启动:

 private void ContextMenuItem1Clicked(object sender, RoutedEventArgs e) { // handle the event for the selected ListViewItem accessing it by ListViewItem selected_lvi = this.m_list.SelectedItem as ListViewItem; } private void ContextMenuItem2Clicked(object sender, RoutedEventArgs e) { // handle the event for the selected ListViewItem accessing it by ListViewItem selected_lvi = this.m_list.SelectedItem as ListViewItem; } 

ListView可以容纳对象,这意味着selected_lvi可以是对象的类型。 刚刚施放到正确的类型。

我希望这有帮助。

最好的祝福,

麦克风

我找到了一个不依赖于鼠标事件处理程序的新解决方案。 ContextMenu有一个“Popup”事件处理程序。

在弹出窗口中,我根据我的上下文添加了我需要的相关菜单项。

示例:

 private MenuItem[] standardMenuItems; private MenuItem[] selectedMenuItems; public SomePanel() { InitializeComponent(); // These are list of menu items (name / callback) that will be // chosen depending on some context standardMenuItems = new MenuItem[] { new MenuItem("New", OnNew) }; selectedMenuItems = new MenuItem[] { new MenuItem("Delete", OnDelete), new MenuItem("Edit", OnEdit) }; ContextMenu contextMenu = new ContextMenu(); // begin with "standard items" contextMenu.MenuItems.AddRange(standardMenuItems); listview.ContextMenu = contextMenu; // add the popup handler contextMenu.Popup += OnMenuPopup; } // Called right before the menu comes up private void OnMenuPopup(object sender, EventArgs e) { ContextMenu menu = sender as ContextMenu; if (menu == null) return; // If an item was selected, display Delete and Edit options if (listview.SelectedItems.Count > 0) { menu.MenuItems.Clear(); menu.MenuItems.AddRange(selectedMenuItems); } // Else display only the New option else { menu.MenuItems.Clear(); menu.MenuItems.AddRange(standardMenuItems); } } 

我在C#和Winforms中不够流利,以确保这种技术没有任何缺点,但它是依赖鼠标事件的替代方法(如果上下文菜单出现在其他键盘或鼠标事件上会怎么样?)

  private void contextMenuStripExport_Opening(object sender, System.ComponentModel.CancelEventArgs e) { if (exportview.SelectedItems.Count <= 0) { uploadToolStripMenuItem.Visible = false; exportToolStripMenuItem.Visible = false; } else { uploadToolStripMenuItem.Visible = true; exportToolStripMenuItem.Visible = true; } }