2007年7月30日月曜日

グリッドのソートとフィルタ(2)

グリッドのソート機能をガシガシと設計実装中。
あらためてやってみると、実は結構頭を悩ませないといけないことが多いのがよーくわかった。

ライブラリの中で行えるソートってのはかなり色々考えておく必要があるので、普通にAPでやるように簡単にはソートを行えないんだよね。理由も簡単で、「比較対象となる値は本当に比較できるのか?」という部分。Stringだー、Integerだーという場合に限定して考えれば、それはたいした問題じゃない。だけどDataGridViewというコントロールである以上は、「セルの値はObject」というケースが多々あるわけで。つきつめると「Objectクラス同士では比較する方法はない」んだよね。そりゃそうなんだけど。比較する方法を判っているのは、その派生クラス側でしかないんだから。

てことでロジックとしてはこんな感じになりそう。

Nothingかどうかをチェックセルの値がIComparableを継承しているならCompareToメソッドを呼び出して、その結果が0(同一)でなければ結果として返却IComparableを継承していない際は、同一の値とみなして次の比較にうつる

大雑把に言えばこんな感じだろうね。実際に比較を行うのはそれぞれのクラスで行う必要があるから。

それで今の問題は「サブエディタ等の複数項目を保持しているクラスでの比較」。この場合は比較対象となる条件(というか項目)を渡してあげる必要があるんだけど、上のIComparableインターフェースと一緒に考えていくとどうもしっくりこない。その理由は「IComparableが単一の値と単一の値の比較」に用いるインターフェースだからなんだよなぁ・・・。

0 件のコメント:

コメントを投稿