WinForms中如何获取右键菜单项所属的TreeNode?
在WinForms右键菜单点击事件中获取所属TreeNode的几种方法
方法一:通过ContextMenuStrip的Tag存储TreeNode
修改TreDevices_AfterLabelEdit方法,将当前节点存入菜单的Tag属性:
private async void TreDevices_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { var contextMenu = new ContextMenuStrip(); e.Node.ContextMenuStrip = contextMenu; // 将当前TreeNode绑定到菜单的Tag contextMenu.Tag = e.Node; var itemEntrada = contextMenu.Items.Add("Entrada"); itemEntrada.Click += InOutItem_Click; }
在点击事件中直接从Tag取出节点:
private async void InOutItem_Click(object? sender, EventArgs e) { if (sender is ToolStripMenuItem item && item.Owner is ContextMenuStrip menu) { // 从Tag中获取目标TreeNode if (menu.Tag is TreeNode targetNode) { // 这里可以直接操作targetNode } } }
方法二:利用TreeView的SelectedNode属性
右键点击TreeNode时,TreeView的SelectedNode会自动切换为被点击的节点,因此可以通过菜单的SourceControl获取树控件,再取SelectedNode:
private async void InOutItem_Click(object? sender, EventArgs e) { if (sender is ToolStripMenuItem item && item.Owner is ContextMenuStrip menu) { if (menu.SourceControl is TreeView treDevices) { TreeNode? targetNode = treDevices.SelectedNode; if (targetNode != null) { // 操作targetNode } } } }
注意:如果用户右键点击树控件空白区域,
SelectedNode可能为空,但你的场景是给TreeNode绑定菜单,所以该情况不会出现。
方法三:通过闭包捕获TreeNode(推荐)
在绑定点击事件时,直接用闭包捕获当前的TreeNode,避免额外的类型转换或依赖控件属性:
private async void TreDevices_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { TreeNode currentNode = e.Node; currentNode.ContextMenuStrip = new ContextMenuStrip(); var itemEntrada = currentNode.ContextMenuStrip.Items.Add("Entrada"); // 绑定事件时通过闭包传入currentNode itemEntrada.Click += (s, args) => OnInOutItemClicked(currentNode, s, args); } // 自定义事件处理方法,直接接收TreeNode参数 private async void OnInOutItemClicked(TreeNode targetNode, object? sender, EventArgs e) { // 直接使用targetNode,无需额外获取 }
内容的提问来源于stack exchange,提问作者jstuardo
相关产品推荐
相关产品推荐

