DataGridViewのソート

DataGridViewのソートは実はstable_sortではないっ!
ということでstable_sortにしてみた。
C#(というかVS2005)のすばらしいところはイベントを駆使することによって
あらゆる動作を自由自在にカスタマイズ可能な点だ。
まあ、あらゆるは言い過ぎだがかなり自由自在だ。


実装方法↓
まずDataGridViewに対してSorted, SortCompareのイベントを追加
そして実装を下記のようにする

#region "stable_sortを実現するためのコード"
private Dictionary _originalRowIndex = new
Dictionary();

private void dataGridView_Sorted(object sender, EventArgs e)
{
  // ソート完了後にはクリアする
  _originalRowIndex.Clear();
}

private void dataGridView_SortCompare(object sender,
DataGridViewSortCompareEventArgs e)
{
  // まずソート開始前に元のインデックスを覚えておく
  // ソート前のイベントが拾えればこんなことしないのに...
  if (_originalRowIndex.Count == 0) {
    for (int i = 0; i < this.dataGridView.RowCount; ++i){
      _originalRowIndex.Add(this.dataGridView.Rows[i], i);
    }
  }

  int result = System.String.Compare(e.CellValue1.ToString().Trim(),
    e.CellValue2.ToString().Trim());

  if (result == 0){ // 等値のときは元のインデックスで判断
    int index1 = this._originalRowIndex[this.dataGridView.Rows[e.RowIndex1]];
    int index2 = this._originalRowIndex[this.dataGridView.Rows[e.RowIndex2]];
    
    if (index1 < index2){
      result = -1;
    } else if (index1 > index2) {
      result = 1;
    }
  }
  e.SortResult = result;
  e.Handled = true;
}
#endregion