2016-01-27 2 views
0

У меня есть DataGridView на WinForm. Когда пользователь щелкает правой кнопкой мыши по сетке, я показываю всплывающее меню. Есть 3 вида всплывающего меню в соответствии с которой правой кнопкой мыши было сделано:Где определить элемент меню обработчик события

  1. на строке, которая определяется как неизменяемые
  2. на строку, которая может быть отредактирован
  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.

ответ

1

Я считаю, что это должно выглядеть следующим образом:

public class GeneralMenu : BaseMenu { 
    protected override void GenerateMenu() { 
     var contextMenu = new ContextMenu(); 
     contextMenu.MenuItems.Add(new MenuItem("Sort", OnSort)); 
     contextMenu.MenuItems.Add(new MenuItem("Print", OnPrint)); 
     _menu = contextMenu; 
    } 
    void OnSort(object sender, EventArgs e) { 
     var gridView = GetSourceControl<DataGridView>(sender); 
     if(gridView != null) { 
      // do sort 
     } 
    } 
    void OnPrint(object sender, EventArgs e) { 
     var gridView = GetSourceControl<DataGridView>(sender); 
     if(gridView != null) { 
      // do print 
     } 
    } 
    static TControl GetSourceControl<TControl>(object sender) where TControl : Control { 
     var menu = ((MenuItem)sender).GetContextMenu(); 
     return (menu != null) ? menu.SourceControl as TControl : null; 
    } 
} 
+0

Да, но проблема в том, что все элементы управления datagridview находятся в форме окна. Должен ли он передаваться в качестве параметра конструктору? – ehh

+0

Это зависит от того, как вы используете результирующее меню. К сожалению, точный способ использования GridPopupMenuFactory неясен из вашего вопроса. Пожалуйста, обновите его, если это возможно ... – DmitryG

+0

Я обновил свой вопрос, спасибо – ehh

1

В конструкторе соответствующих классов.

+0

Можете ли вы уточнить? Каждый класс содержит несколько элементов меню, а затем несколько обработчиков событий. – ehh

Смежные вопросы