Можно ли использовать статический класс для сбора общих обработчиков событий? - PullRequest
1 голос
/ 14 января 2012

В приложении Windows Forms есть некоторые вещи, которые я хочу, чтобы различные элементы управления одного типа в разных формах всегда делали для определенных событий. Например, я хочу одним щелчком мыши на DataGridViewCell, который имеет тип TextBox и предназначен не только для чтения, чтобы автоматически войти в режим редактирования. Простой код обработчика событий, в данном случае в форме с 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);                
    }
}

Я мог бы легко переместить этот метод в статический класс, скажем, CommonEvents, а затем обработчики Load моих индивидуальных форм назначают определение статического метода соответствующему событию CellClick DataGridViews

this.dgvParms.CellClick += CommonEvents.dgvEditOnCellClick;

Это приемлемая или хорошая практика? Или предпочтительнее хранить логику обработчика событий с кодом каждой потребляющей формы? Конечно, я мог бы сделать что-то промежуточное (но избыточное), определив локальные обработчики событий, которые затем вызывают общий метод, такой как

this.dgvParms.CellClick += (a, b) => CommonEvents.dgvEditOnCellClick(a, b);

Ответы [ 2 ]

6 голосов
/ 14 января 2012

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

2 голосов
/ 14 января 2012

Это выглядит абсолютно нормально для меня, хотя, конечно, вам придется изменить свой код, чтобы использовать аргумент 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);                
    }
}

Общий подходизменение или добавление поведения к элементу управления путем обработки и реагирования на его события называется прикрепленным поведением .Обычно он используется в WPF, но нет ничего плохого в том, чтобы использовать его и в WinForms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...