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

Это хорошая практика? У меня есть 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's 
    /// 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?


person Corpsekicker    schedule 28.07.2009    source источник
comment
Вы можете, но параметр отправителя не очень надежен (небезопасен для типов,...). Более того, используйте приведение, а не as, потому что вы ожидаете DataGridView и ничего другого.   -  person Guillaume    schedule 28.07.2009


Ответы (7)


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

person Cody C    schedule 28.07.2009

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

person Charles Bretana    schedule 28.07.2009

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

person Kumar    schedule 28.07.2009

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

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

person Richard Lucas    schedule 28.07.2009

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

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

person CodeRedick    schedule 28.07.2009

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

if (sender == dataGrid1)

и т. д. Но если у вас есть определенные функции, требующие знания того, какой из них вызвал событие, вам, вероятно, следует выполнить рефакторинг для отдельных обработчиков.

person Jamie Ide    schedule 28.07.2009

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

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

person bbohac    schedule 28.07.2009