2009-03-13 6 views
4

В моем текущем проекте я использую четыре вида сетки в разных вкладках. По мере разработки системы у них есть несколько общих методов, таких как показ пользовательской всплывающей подсказки и контекстное меню, когда в строках.Reuse event handler хорошая практика в C#

Теперь я выполняю упражнение по очистке кода. Ниже я вижу, что теперь у меня есть четыре обработчика событий, вызывающих один и тот же метод. Можно ли изменить обработчики событий, чтобы указать прямо на GridMenu, избегая лишнего кода? Повлияет ли это на меня позже?

Очевидно, что в настоящее время я использую стандартные имена обработчиков.

private void grdEnquiriesLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdApplicantsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdApplicationsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdInterviewsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void GridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridView view = (GridView)sender; 

     if (view.CalcHitInfo(e.Point).InRow) 
      popupMenu1.ShowPopup(Cursor.Position); 
    } 

ответ

10

Вместо регистрации непосредственно на GridMenu, создайте общий обработчик событий с именем Grid_ShowGridMenu.

Просто зарегистрируйтесь в том же обработчике событий для каждой сетки, вместо того, чтобы создавать отдельный обработчик событий для каждой сетки.

grdEnquiriesLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdApplicantsLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdApplicationsLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdInterviewsLevel1.ShowGridMenu += Grid_ShowGridMenu; 


private void Grid_ShowGridMenu(object sender, GridMenuEventArgs e) 
{ 
    GridMenu((GridView)sender, e.Point); 
} 

Теперь, вместо передачи sender, e непосредственно GridMenu, проходит только необходимых значения GridMenu и изменить подпись GridMenu поэтому он может быть более многоразовые.

private void GridMenu(GridView grid, Point hitPoint) 
{ 
    if (grid.CalcHitInfo(hitPoint).InRow) 
     popupMenu1.ShowPopup(Cursor.Position); 
} 
+0

@Rich B: Спасибо Rich B, я только что узнал об этих backticks после прочтения ваших изменений. – Sung

0

Пока код события является общим для всех элементов управления, этот метод является точным и чистым.

Если вы начинаете с ключами if/else или switch в коде, то, возможно, пора передумать.

+1

Как можно повторять себя 5 раз называть «чистым»? Здесь нет причин иметь более одного метода обработки событий, который либо сам выполняет работу, либо отдает другой метод с другой подписью. –

+0

Читайте в + ve. «... тогда этот метод прекрасен и чист». относится к @ petebob796, говорящему: «Хорошо ли изменить обработчики событий, чтобы указать прямо на GridMenu ...». Вы не должны принимать -ve в публикации только потому, что langauge не идеальна! – TFD

0

Вы должны создать пользовательский элемент управления, который инкапсулирует вашу пользовательскую сетку. Таким образом, все ваше поведение будет инкапсулировано и повторно использовано.

+0

Что делать, если он не используется повторно? – TFD

+0

В этом случае он используется 4 раза - следовательно, дублирование кода. –