У нас похожая реализация на работе. Это довольно простой дизайн, и он хорошо работает.
Вы можете добавить уникальный идентификатор к каждому элементу меню. Это может быть так же просто, как:
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();
});
(Что-то в этом роде, возможно, у меня немного отключен синтаксис)
Обновлять:
Свойство «Тег» элемента управления элементом древовидного представления заполняется следующим образом, следуя приведенному выше примеру:
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;
}
person
emptyset
schedule
19.09.2009