У нас похожая реализация на работе. Это довольно простой дизайн и хорошо работает.
Возможно, вы захотите добавить уникальный идентификатор для каждого элемента MenuItem. Это может быть так просто, как:
public enum MenuItems
{
File_New = 100,
File_Save = 110,
// ...
}
И вы включаете этот номер в базу данных. Затем, когда вы записываете пункты меню, у вас может быть словарь, который отображает целое число MenuItems на делегат (для обработки события execute):
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;
}