У меня есть DataGridView на WinForm. Когда пользователь щелкает правой кнопкой мыши по сетке, я показываю всплывающее меню. Есть 3 вида всплывающего меню в соответствии с которой правой кнопкой мыши было сделано:Где определить элемент меню обработчик события
- на строке, которая определяется как неизменяемые
- на строку, которая может быть отредактирован
- на любом другом месте в сетка (rowindex is -1)
Я создал новые классы для управления генерацией всплывающих меню.
public class GridPopupMenuFactory
{
public ContextMenu GetMenu(int rowIndex, bool isReadOnlyRow)
{
BaseMenu _menu = null;
switch (rowIndex)
{
case -1:
_menu = new GeneralMenu();
break;
default:
if (isReadOnlyRow)
{
_menu = new ReadonlyRowMenu();
}
else
{
_menu = new EditableRowMenu();
}
break;
}
return _menu.Menu;
}
}
public abstract class BaseMenu
{
protected ContextMenu _menu;
public ContextMenu Menu
{
get
{
if (_menu.MenuItems.Count == 0)
{
GenerateMenu();
}
return _menu;
}
}
protected abstract void GenerateMenu();
}
public class GeneralMenu : BaseMenu
{
protected override void GenerateMenu()
{
var contextMenu = new ContextMenu();
contextMenu.MenuItems.Add(new MenuItem("Sort"));
contextMenu.MenuItems.Add(new MenuItem("Print"));
_menu = contextMenu;
}
}
public class ReadonlyRowMenu : BaseMenu
{
protected override void GenerateMenu()
{
var contextMenu = new ContextMenu();
contextMenu.MenuItems.Add(new MenuItem("View"));
_menu = contextMenu;
}
}
public class EditableRowMenu : BaseMenu
{
protected override void GenerateMenu()
{
var contextMenu = new ContextMenu();
contextMenu.MenuItems.Add(new MenuItem("Add"));
contextMenu.MenuItems.Add(new MenuItem("Edit"));
contextMenu.MenuItems.Add(new MenuItem("Delete"));
_menu = contextMenu;
}
}
// Winform
private void shipmentDetailsDataGridView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var rowIndex = shipmentDetailsDataGridView.HitTest(e.X, e.Y).RowIndex;
var popupMenu = GridPopupMenu.GetMenu(rowIndex, false); // 2nd parameter can be true, TODO
popupMenu.Show(shipmentDetailsDataGridView, new Point(e.X, e.Y));
}
}
Мой вопрос: где указать место для определения обработчика событий для каждого из пунктов меню?
Обновление: После нажатия на элемент меню вся операция выполняется в самом DataGridView. Например, нажав на add, откроется временная форма со всем необходимым полем, а затем эта информация будет добавлена в новую строку в DataGridView.
Да, но проблема в том, что все элементы управления datagridview находятся в форме окна. Должен ли он передаваться в качестве параметра конструктору? – ehh
Это зависит от того, как вы используете результирующее меню. К сожалению, точный способ использования GridPopupMenuFactory неясен из вашего вопроса. Пожалуйста, обновите его, если это возможно ... – DmitryG
Я обновил свой вопрос, спасибо – ehh