这是好习惯吗? 我有3个DataGridView,我希望有一个工具允许用户通过单击列标题对数据进行排序。我可以为每个DataGridView的ColumnHeaderMouseClick事件创建一个事件处理程序,但我做了一个:
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事件都连接到此处理程序。这意味着为了实现哪一个在运行时引发事件,我不得不说(sender作为DataGridView)。这样安全吗?发件人可能是不是DataGridView的东西吗?
答案 0 :(得分:5)
不仅可以,而且更好,因为它使您的代码更具可重用性,可维护性和可扩展性。
答案 1 :(得分:3)
我认为这是非常可以接受的,我经常将它用于具有类似功能的控件。您可以在事件中添加一个检查,以确保发件人属于datagrid类型,如果您担心发件人是其他对象。
答案 2 :(得分:2)
这是一种很好的做法,遵循DRY(不要重复自己)原则
答案 3 :(得分:1)
如果您想要安全,可以在尝试对其进行任何操作之前检查发件人的类型。
理论上你不应该将任何其他对象“ColumnHeaderMouseClick”的处理程序设置为此,所以这不是必需的。
答案 4 :(得分:0)
只要您编写处理程序以正确处理每个控件...当最好需要在多个控件上完成相同的操作时,这是最好的。
基本上只要它有效,并且易于维护你应该是好的。
答案 5 :(得分:0)
这很好,很安全。一个小小的修正:你可以通过
检查哪一个引发了这个事件if (sender == dataGrid1)
等。但是如果你有特定的功能需要知道哪一个引发了事件,那么你应该重构个别处理程序。
答案 6 :(得分:0)
在我看来,这个解决方案绝对没问题。 你保存了两个事件处理程序,实际上会完全相同的东西。 如果在每个处理程序中都有不同的做法,那么你不应该这样做,但是这样可以节省开发并保持时间。
只要其中一个DataGridViews有一个特定的工作要对事件处理程序做,你应该为它自己提供一个事件处理程序。