Это хорошая практика? У меня есть 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?
Я думаю, что это очень приемлемо, и я часто использую это для элементов управления, которые имеют аналогичную функциональность. Вы можете добавить проверку в событие, чтобы убедиться, что отправитель имеет тип datagrid, если вы заинтересованы в отправителе, являющемся каким-то другим объектом.
не только это нормально, это лучше, потому что это делает ваш код более полезным, удобным и расширяемым.
это хорошая практика и следует принципу DRY (не повторяйте)
Если вы хотите быть в безопасности, вы всегда можете проверить тип отправителя, прежде чем пытаться что-либо сделать с ним.
В теории вы не должны устанавливать обработчик любых других объектов "ColumnHeaderMouseClick", чтобы это не было необходимо.
Это решение абсолютно прекрасное, на мой взгляд. Вы сохранили два обработчика событий, которые на самом деле будут делать то же самое. Если в каждом из обработчиков были разные тонкости, вы не должны были делать это таким образом, но здесь это экономия времени на разработку и поддержание времени.
Как только у одного из DataGridViews есть определенное задание для обработчика событий, вы должны дать ему обработчик событий для него.
Это прекрасно и безопасно. Небольшая коррекция: вы должны проверить, для какого события было поднято событие
if (sender == dataGrid1)
и т.д.. Но если у вас есть определенная функциональность, которая требует знания того, кто поднял это событие, вы должны, вероятно, реорганизовать отдельные обработчики.
До тех пор, пока вы пишете обработчик для правильной обработки каждого элемента управления... что лучше всего, когда то же самое нужно делать на нескольких элементах управления.
В принципе до тех пор, пока он работает, и будет легко поддерживать вас, вы должны быть хорошими.