Безопасно ли использовать один и тот же обработчик событий для разных элементов управления Windows Forms?

2

Это хорошая практика? У меня есть 3 DataGridView, и я хочу иметь средство, которое позволяет пользователю сортировать данные, нажимая на заголовок столбца. У меня мог быть обработчик событий для события ColumnHeaderMouseClick для каждого из этих DataGridView, но вместо этого я сделал один:

private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        SortDataGridView((sender as DataGridView), e.ColumnIndex);
    }

SortDataGridView выглядит следующим образом:

/// <summary>
    /// Sorts a given DataGridView by a column given by its columnIndex.
    /// Default sort (if it isn't currently sorted) is Ascending. If it 
    /// already sorted Ascending, change it to Descending. If it is Descending,
    /// change it to Ascending.
    /// </summary>
    /// <param name="dataGridViewToSort">The DataGridViewToSort</param>
    /// <param name="columnIndexToSortBy">The index of the column which we want to sort by in the DataGridView.</param>
    private void SortDataGridView(DataGridView dataGridViewToSort, int columnIndexToSortBy)
    {
        switch (dataGridViewToSort.SortOrder)
        {
            case SortOrder.Ascending:
                dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Descending);
                break;
            case SortOrder.Descending:
                dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Ascending);
                break;
            case SortOrder.None:
                dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Ascending);
                break;
            default:
                break;
        }
    }

Каждое событие DataGridView ColumnHeaderMouseClick подключается к этому обработчику. Это означает, что для того, чтобы понять, какой из них поднял событие во время выполнения, я должен сказать (отправитель как DataGridView). Это безопасно? Может ли отправитель когда-либо быть чем-то не DataGridView?

  • 0
    Вы можете, но параметр sender не очень надежен (не тип safe, ...). Кроме того, используйте приведение, а не как, потому что вы ожидаете DataGridView и ничего больше.
Теги:
winforms
event-handling

7 ответов

3
Лучший ответ

Я думаю, что это очень приемлемо, и я часто использую это для элементов управления, которые имеют аналогичную функциональность. Вы можете добавить проверку в событие, чтобы убедиться, что отправитель имеет тип datagrid, если вы заинтересованы в отправителе, являющемся каким-то другим объектом.

5

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

2

это хорошая практика и следует принципу DRY (не повторяйте)

1

Если вы хотите быть в безопасности, вы всегда можете проверить тип отправителя, прежде чем пытаться что-либо сделать с ним.

В теории вы не должны устанавливать обработчик любых других объектов "ColumnHeaderMouseClick", чтобы это не было необходимо.

0

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

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

0

Это прекрасно и безопасно. Небольшая коррекция: вы должны проверить, для какого события было поднято событие

if (sender == dataGrid1)

и т.д.. Но если у вас есть определенная функциональность, которая требует знания того, кто поднял это событие, вы должны, вероятно, реорганизовать отдельные обработчики.

0

До тех пор, пока вы пишете обработчик для правильной обработки каждого элемента управления... что лучше всего, когда то же самое нужно делать на нескольких элементах управления.

В принципе до тех пор, пока он работает, и будет легко поддерживать вас, вы должны быть хорошими.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню