如何从DataGrid字符串列表动态生成ContextMenu菜单项?
动态生成WinForms上下文菜单并绑定网络驱动器点击事件
1. 修正剩余的AddRange使用问题
你当前代码里的AddRange($menuEntry)仍不符合API要求:MenuItems.AddRange()需要传入MenuItem数组,单个菜单项应该用Add()方法,显式调用更清晰且能避免潜在问题:
foreach ($row in $dataGrid.Rows){ $nameTag = $row.Cells[$DATAGRID_COLUMN_NAME].Value if ($nameTag -ne $null){ $menuEntry = New-Object System.Windows.Forms.MenuItem $menuEntry.Text = $nameTag # 改用Add()添加单个菜单项 $Main_Tool_Icon.ContextMenu.MenuItems.Add($menuEntry) } }
2. 绑定菜单项的点击事件
要实现点击菜单项打开对应网络驱动器,需为每个MenuItem绑定Click事件处理脚本块。注意循环中变量作用域问题,通过脚本块参数捕获当前菜单项的文本值,避免所有菜单项引用最后一个变量值:
foreach ($row in $dataGrid.Rows){ $nameTag = $row.Cells[$DATAGRID_COLUMN_NAME].Value if ($nameTag -ne $null){ $menuEntry = New-Object System.Windows.Forms.MenuItem $menuEntry.Text = $nameTag # 绑定点击事件,通过$sender获取当前触发事件的菜单项 $menuEntry.Add_Click({ param($sender, $e) $drivePath = $sender.Text # 调用资源管理器打开目标路径 Start-Process explorer.exe -ArgumentList $drivePath }) $Main_Tool_Icon.ContextMenu.MenuItems.Add($menuEntry) } }
3. 更优实现:使用ContextMenuStrip替代旧的ContextMenu
ContextMenu是.NET Framework早期控件,推荐使用功能更丰富的ContextMenuStrip(支持图标、灵活样式、更完善的事件体系),实现更简洁高效:
# 创建ContextMenuStrip替代旧的ContextMenu $contextMenuStrip = New-Object System.Windows.Forms.ContextMenuStrip $Main_Tool_Icon.ContextMenuStrip = $contextMenuStrip # 动态添加网络驱动器菜单项 foreach ($row in $dataGrid.Rows){ $nameTag = $row.Cells[$DATAGRID_COLUMN_NAME].Value if ($nameTag -ne $null){ # 直接创建并添加菜单项,同时绑定点击事件 $menuItem = $contextMenuStrip.Items.Add($nameTag) $menuItem.Add_Click({ Start-Process explorer.exe $this.Text }) } } # 添加分隔线 $contextMenuStrip.Items.Add("-") # 添加"Edit"菜单项并绑定事件 $editItem = $contextMenuStrip.Items.Add("Edit") $editItem.Add_Click({ # 此处添加显示主窗体的逻辑 $mainForm.Show() })
ContextMenuStrip的核心优势:
- 内置分隔线创建逻辑,无需手动处理
- 支持自定义图标、样式和布局
- 事件模型更清晰,性能更优
内容的提问来源于stack exchange,提问作者Simon Jolin
相关产品推荐
相关产品推荐

