我们在工作中也有类似的实现。这是一个非常简单的设计,效果很好。
您可能希望为每个 MenuItem 添加一个唯一标识符。这可以很简单:
public enum MenuItems
{
File_New = 100,
File_Save = 110,
// ...
}
然后您将这个数字包含在数据库中。然后,当您写出菜单项时,您可以拥有一个将 MenuItems 整数映射到委托的字典(用于处理执行事件):
delegate void MenuItemExecuteHandler();
IDictionary<int, MenuItemExecuteHandler> MenuItemHandlers;
在某处定义映射:
MenuItemHandlers.Add(MenuItems.File_New, this.OnFileNewClick());
这样当您连接菜单项事件处理程序时,您可以调用正确的方法来执行正确的操作:
int id = 100; // Retrieved from the database.
MenuItems menuItem = (MenuItems)Enum.TryParse(typeof(MenuItems), id);
string command = "..."; // Retrieved from the database using the MenuItem ID.
MenuItemControl control = new MenuItemControl();
control.Text = command;
control.OnClick += new EventHandler(delegate (object sender, EventArgs args)
{
MenuItemHandlers[menuItem].Invoke();
});
(大意是这样,我的语法可能有点不对)
更新:
树视图项控件的“Tag”属性按照上面的示例填充如下:
TreeItemControl control = new TreeItemControl();
control.Text = "New File"; // Retrieved from database.
control.Tag = 100; // Retrieved from database.
然后,在寻找要写的内容时:
if (control.CheckState = CheckState.Checked)
{
row["MenuItemID"] = control.Tag;
row["Allowed"] = true;
}