为不同的Windows窗体控件使用相同的事件处理程序是否安全?

时间:2009-07-28 13:20:39

标签: c# winforms event-handling

这是好习惯吗? 我有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的东西吗?

7 个答案:

答案 0 :(得分:5)

不仅可以,而且更好,因为它使您的代码更具可重用性,可维护性和可扩展性。

答案 1 :(得分:3)

我认为这是非常可以接受的,我经常将它用于具有类似功能的控件。您可以在事件中添加一个检查,以确保发件人属于datagrid类型,如果您担心发件人是其他对象。

答案 2 :(得分:2)

这是一种很好的做法,遵循DRY(不要重复自己)原则

答案 3 :(得分:1)

如果您想要安全,可以在尝试对其进行任何操作之前检查发件人的类型。

理论上你不应该将任何其他对象“ColumnHeaderMouseClick”的处理程序设置为此,所以这不是必需的。

答案 4 :(得分:0)

只要您编写处理程序以正确处理每个控件...当最好需要在多个控件上完成相同的操作时,这是最好的。

基本上只要它有效,并且易于维护你应该是好的。

答案 5 :(得分:0)

这很好,很安全。一个小小的修正:你可以通过

检查哪一个引发了这个事件
if (sender == dataGrid1)

等。但是如果你有特定的功能需要知道哪一个引发了事件,那么你应该重构个别处理程序。

答案 6 :(得分:0)

在我看来,这个解决方案绝对没问题。 你保存了两个事件处理程序,实际上会完全相同的东西。 如果在每个处理程序中都有不同的做法,那么你不应该这样做,但是这样可以节省开发并保持时间。

只要其中一个DataGridViews有一个特定的工作要对事件处理程序做,你应该为它自己提供一个事件处理程序。