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

时间:2012-01-14 17:24:21

标签: c# winforms events

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

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);                
    }
}

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

this.dgvParms.CellClick += CommonEvents.dgvEditOnCellClick;

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

)在两者之间做一些事情(但是多余的)
this.dgvParms.CellClick += (a, b) => CommonEvents.dgvEditOnCellClick(a, b);

2 个答案:

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

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

答案 1 :(得分:2)

这看起来对我来说绝对没问题,当然你必须改变你的代码才能使用sender参数找到引发事件的DataGridView

private void dgvParms_CellClick(object sender, DataGridViewCellEventArgs e) {
    DataGridView dgvParams = sender as DataGridView;
    DataGridViewCell c = dgvParms[e.ColumnIndex, e.RowIndex];
    if (!c.ReadOnly && c is DataGridViewTextBoxCell) {
        dgvParms.CurrentCell = c;
        dgvParms.BeginEdit(true);                
    }
}

通过处理和响应事件来更改或添加行为的一般方法称为attached behaviour。它最常用于WPF,但在WinForms中使用它也没有任何问题。