ContextMenuStrip帮助类(只有一级菜单)

帮助类代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Windows.Forms;
  4 
  5 namespace YourNamespace.Utilities
  6 {
  7     /// <summary>
  8     /// ContextMenuStrip 帮助类,用于简化右键菜单的创建和管理。
  9     /// </summary>
 10     public static class ContextMenuHelper
 11     {
 12         /// <summary>
 13         /// 创建一个新的 ContextMenuStrip 并添加菜单项。
 14         /// </summary>
 15         /// <param name="menuItems">菜单项文本和其点击事件的键值对。</param>
 16         /// <param name="withSeparator">是否在每个菜单项后添加分隔线(最后一个除外)。</param>
 17         /// <returns>配置好的 ContextMenuStrip。</returns>
 18         public static ContextMenuStrip Create(Dictionary<string, EventHandler> menuItems, bool withSeparator = false)
 19         {
 20             ContextMenuStrip menu = new ContextMenuStrip();
 21 
 22             foreach (var item in menuItems)
 23             {
 24                 ToolStripMenuItem menuItem = new ToolStripMenuItem(item.Key);
 25                 menuItem.Click += item.Value;
 26                 menu.Items.Add(menuItem);
 27 
 28                 if (withSeparator && menuItems.Last().Key != item.Key)
 29                 {
 30                     menu.Items.Add(new ToolStripSeparator());
 31                 }
 32             }
 33             return menu;
 34         }
 35 
 36         /// <summary>
 37         /// 将指定的 ContextMenuStrip 动态绑定到控件的 MouseDown 事件上,以响应右键点击。
 38         /// </summary>
 39         /// <param name="control">目标控件。</param>
 40         /// <param name="menu">要绑定的 ContextMenuStrip。</param>
 41         public static void BindToControlMouseDown(Control control, ContextMenuStrip menu)
 42         {
 43             control.MouseDown += (sender, e) =>
 44             {
 45                 if (e.Button == MouseButtons.Right)
 46                 {
 47                     menu.Show(control, e.Location);
 48                 }
 49             };
 50         }
 51 
 52         /// <summary>
 53         /// 在现有菜单的指定索引位置插入一个新的菜单项。
 54         /// </summary>
 55         /// <param name="menu">目标菜单。</param>
 56         /// <param name="index">插入位置的索引。</param>
 57         /// <param name="text">新菜单项的文本。</param>
 58         /// <param name="clickHandler">点击事件处理程序。</param>
 59         public static void InsertMenuItem(ContextMenuStrip menu, int index, string text, EventHandler clickHandler)
 60         {
 61             ToolStripMenuItem newItem = new ToolStripMenuItem(text);
 62             newItem.Click += clickHandler;
 63             menu.Items.Insert(index, newItem);
 64         }
 65 
 66         /// <summary>
 67         /// 根据名称查找菜单中的 ToolStripMenuItem。
 68         /// </summary>
 69         /// <param name="menu">目标菜单。</param>
 70         /// <param name="itemName">要查找的菜单项名称(ToolStripItem.Name)。</param>
 71         /// <returns>找到的菜单项,未找到则返回null。</returns>
 72         public static ToolStripMenuItem FindMenuItemByName(ContextMenuStrip menu, string itemName)
 73         {
 74             foreach (ToolStripItem item in menu.Items)
 75             {
 76                 if (item is ToolStripMenuItem menuItem && menuItem.Name == itemName)
 77                 {
 78                     return menuItem;
 79                 }
 80             }
 81             return null;
 82         }
 83 
 84         /// <summary>
 85         /// 根据菜单项文本动态启用或禁用菜单项。通常在菜单 Opening 事件中调用[citation:3]。
 86         /// </summary>
 87         /// <param name="menu">目标菜单。</param>
 88         /// <param name="itemText">菜单项文本。</param>
 89         /// <param name="enabled">启用状态。</param>
 90         public static void SetMenuItemEnabledByText(ContextMenuStrip menu, string itemText, bool enabled)
 91         {
 92             foreach (ToolStripItem item in menu.Items)
 93             {
 94                 if (item.Text == itemText)
 95                 {
 96                     item.Enabled = enabled;
 97                     break;
 98                 }
 99             }
100         }
101     }
102 }

帮助类功能与使用场景说明

这个帮助类主要解决了以下几个常见场景的痛点:

 
功能模块主要方法解决的问题/适用场景
快速创建 Create 避免重复编写创建菜单项、绑定事件的代码,一键生成基础菜单。
动态绑定 BindToControlMouseDown 对于没有内置ContextMenuStrip属性的控件或需要更灵活触发条件的场景(如特定区域右键)。
动态管理 InsertMenuItemFindMenuItemByName 在运行时根据程序状态动态增删或查找菜单项。
状态控制 SetMenuItemEnabledByText 根据上下文(如是否有选中项)动态启用/禁用某些菜单项,提升用户体验。

 

完整使用示例:DataGridView右键菜单

以下示例演示了如何在DataGridView上使用帮助类实现一个具有复制、粘贴和动态删除功能的右键菜单。

 1 public partial class MainForm : Form
 2 {
 3     private ContextMenuStrip dataGridViewMenu;
 4 
 5     public MainForm()
 6     {
 7         InitializeComponent();
 8         SetupContextMenu();
 9     }
10 
11     private void SetupContextMenu()
12     {
13         // 1. 使用帮助类创建菜单
14         var menuItems = new Dictionary<string, EventHandler>
15         {
16             { "复制", MenuItem_Copy_Click },
17             { "粘贴", MenuItem_Paste_Click },
18             { "删除", MenuItem_Delete_Click }
19         };
20         dataGridViewMenu = ContextMenuHelper.Create(menuItems, withSeparator: true);
21 
22         // 2. 绑定到DataGridView的MouseDown事件,实现右键触发
23         ContextMenuHelper.BindToControlMouseDown(dataGridView1, dataGridViewMenu);
24 
25         // 3. (可选)在菜单打开前动态设置“删除”项是否可用
26         dataGridViewMenu.Opening += (sender, e) =>
27         {
28             // 仅当有选中行时,“删除”项才可用
29             ContextMenuHelper.SetMenuItemEnabledByText(dataGridViewMenu, "删除", dataGridView1.SelectedRows.Count > 0);
30         };
31     }
32 
33     // 菜单项点击事件处理程序
34     private void MenuItem_Copy_Click(object sender, EventArgs e)
35     {
36         // 实现复制逻辑...
37         MessageBox.Show("执行复制");
38     }
39 
40     private void MenuItem_Paste_Click(object sender, EventArgs e)
41     {
42         // 实现粘贴逻辑...
43         MessageBox.Show("执行粘贴");
44     }
45 
46     private void MenuItem_Delete_Click(object sender, EventArgs e)
47     {
48         // 实现删除选中行逻辑...
49         if (dataGridView1.SelectedRows.Count > 0)
50         {
51             dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
52         }
53     }
54 }

总的来说,ContextMenuHelper 帮助类通过封装常见操作,可以减少你的重复代码,让你更专注于业务逻辑的实现。

posted @ 2025-12-22 16:42  家煜宝宝  阅读(1)  评论(0)    收藏  举报