使用静态类来收集常见的事件处理程序是否可行?

Jos*_*nig 1 c# events winforms

在Windows窗体应用程序中,有些事情我希望在不同表单上使用相同类型的各种控件来始终对某些事件执行操作.例如,我想单击一个TextBox类型的DataGridViewCell,并且不能只读取自动进入编辑模式.简单的事件处理程序代码,在这种情况下,在一个名为DataGridView的表单上dgvParms,是:

private void dgvParms_CellClick(object sender, DataGridViewCellEventArgs e) {
    DataGridViewCell c = dgvParms[e.ColumnIndex, e.RowIndex];
    if (!c.ReadOnly && c is DataGridViewTextBoxCell) {
        dgvParms.CurrentCell = c;
        dgvParms.BeginEdit(true);                
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以轻松地将此方法移动到静态类,比如说CommonEvents,然后在我的各个表单的Load处理程序上将静态方法定义分配给相应的DataGridViews的CellClick事件

this.dgvParms.CellClick += CommonEvents.dgvEditOnCellClick;
Run Code Online (Sandbox Code Playgroud)

这是可接受的还是良好的做法?或者它是否优先保留事件处理程序逻辑与每个消费形式的代码?我当然可以通过定义本地事件处理程序然后调用公共方法来做两件事(但是多余的),例如

this.dgvParms.CellClick += (a, b) => CommonEvents.dgvEditOnCellClick(a, b);
Run Code Online (Sandbox Code Playgroud)

XIV*_*ons 6

您可以尝试通过继承DatagridView来定义自己的自定义DataGridView,然后添加此项以及您需要的任何其他专门行为.此刻我无法测试下面的代码,但我认为这是正确的:

public class MyDgv : DataGridView
{
    protected override void OnCellClick(DataGridViewCellEventArgs e)
    {
        DataGridViewCell c = this[e.ColumnIndex, e.RowIndex];
        if (!c.ReadOnly && c is DataGridViewTextBoxCell)
        {
            this.CurrentCell = c;
            this.BeginEdit(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能有一些理由不这样做,但如果您喜欢所有dgv控件中的这种特定行为,只需使用您的自定义实现.