2009-07-28 7 views
2

これは良い方法ですか? 私は3つのDataGridViewを持っており、ユーザーが列ヘッダーをクリックしてデータを並べ替えることができる機能が必要です。私はこれらのDataGridViewのごとにColumnHeaderMouseClickイベントのイベントハンドラを持っていた可能性があり、代わりに私は1つを作った:異なるWindowsフォームコントロールに対して同じイベントハンドラを使用することは安全ですか?

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ではないものになることはありますか?

+0

に従います。 また、キャストを使用して、DataGridViewとそれ以外のものは期待しないので、asを使用しないでください。 – Guillaume

答えて

3

これは非常に受け入れやすいと私はこれをよく似た機能を持つコントロールに使用します。送信者が他のオブジェクトであることに懸念がある場合、送信者がデータグリッドタイプであることを確認するために、イベントにチェックを追加できます。

1

安全を考えたければ、何かをしようとする前に常に送信者のタイプを確認することができます。

理論上、他のオブジェクト「ColumnHeaderMouseClick」のハンドラにこのハンドラを設定するべきではないので、これは必要ではありません。

5

あなたのコードをより再利用可能で保守性と拡張性に優れているので、それは良いです。

0

各コントロールを適切に処理するハンドラを作成している限り、正確に同じことを複数のコントロールで行う必要がある場合に最適です。

基本的には動作し、維持しやすいでしょう。

0

安全で安全です。小さな訂正:あなたはどちらをチェックするでしょうが

if (sender == dataGrid1) 

によってなどをイベントを発生させた。しかし、あなたが、あなたはおそらく、個々のハンドラにリファクタリングすべきイベントを発生させたどちら知る必要が特定の機能を持っている場合。

0

このソリューションは、私の意見では絶対に問題ありません。 2つのイベントハンドラを保存しました。実際にはまったく同じ処理を行います。 ハンドラのそれぞれに異なる細かさがある場合は、そのようにしてはいけませんが、ここでは開発と時間を節約しています。

DataGridViewの1つにイベントハンドラの特定のジョブがある場合は、そのイベントハンドラに独自のイベントハンドラを渡す必要があります。

2

それは良い習慣だと(...、タイプセーフではない)することができますが、送信者のパラメータが本当に信頼できるものではありませんDRY(いけない」自分自身を繰り返す)原則