在C#中重用事件处理程序的良好实践

时间:2009-03-13 03:24:50

标签: c# .net

在我当前的项目中,我在不同的标签中使用了四个网格视图。随着系统的发展,它们有一些共享方法,例如显示自定义工具提示和行时的右键菜单。

我现在正在进行代码清理练习。我在下面看到的是,我现在有四个事件处理程序调用相同的方法。是否可以将事件处理程序更改为直接指向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);
    }

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

只要事件代码对所有控件都是通用的,那么这种方法就很好而且干净。

如果您在代码中开始使用主要的if / else或switch块,那么可能是重新思考的时候了。

答案 2 :(得分:0)

您应该创建一个封装自定义网格的用户控件。这样,您的所有行为都将被封装并可重复使用。