DataGridView + SortableBindingList = 楽

久しぶりにC#、WinFormの話題。ただいまC#WPF時代到来ですがWinFormです。
DataGridView にオブジェクトを載せると、列のヘッダをクリックしての自動ソートができなくてがっかりします。これをカイゼン
VisualStudio2005 は、データベースのフロントエンドのようなアプリをコードを書かずに作れてしまう(無料の Express であっても!)めちゃくちゃスゴイ機能があります。本格的なアプリの礎にも、ちょっとしたツールにも便利に使えます。なにこの IDE の進化っぷりは!
データベースだと列ヘッダをクリックすると▼▲みたいなのが表示されて、列の内容でソートできます。コーディングレスでここまでできます。でも、オブジェクト(というより型ですが)を入れるとコードを書かないとソートできません。データベースは自動なのに、差別です!数行書けばいいだけなんだけど、データベースは書かなくてもいいのにって思うとものっっすごく面倒に感じます(^^;


カスタム データ バインド (第 2 部)
http://www.microsoft.com/japan/msdn/columns/winforms/winforms02182005.aspx

このMSDNの古い記事に、どんな型でもソート可能にする SortableBindingList が載っています!すばらしい!VisualStudio で自動生成される「DataGridView - BindingSource - オブジェクト」の形を「DataGridView - BindingSource - SortableBindingList - オブジェクト」とするだけで、どんな型でも自動ソート対応にしてしまいます。のハズなんですが、実は動きません…。
この記事のサンプルでは、なぜか記事本文に書いてあるいくつかのメソッドの実装が欠けてます。さらに、β時代のコードなのでそのままではビルドできず、直してビルドしてもシリアライズの形式が変わったのか、添付データは読めないのでゲームは遊べませんので、あしからず。
欠けてる部分の実装は http://www.thescripts.com/forum/thread441915.html の #7 で Bart Mermuys さんが投稿しています。ApplySortCore() が改悪されてるのが気になりますが。MSDN記事の肝はここに載っている2クラスなので、これだけ見れば元記事のサンプルは見なくてもOKです。ただし、MSDN記事のサンプルコードについてるEULAは目を通すのを忘れずに。
実際に使うには PropertyComparer がプロパティ値の null を考慮してなかったりするので、もうちょっと堅牢にしたほうがいいですね。SortableBindingList クラスに、以下の2行を加えると便利です。

public SortableBindingList() { }
public SortableBindingList( IList<T> list ) : base( list ) { }

使い方は簡単。例えば File.cs というエンティティクラスを作って DataGridView 型アプリを生成したら、BindingSource fileBindingSource が Form にできます。コンストラクタや Load あたりで this.fileBindingSource.DataSource = sortableBindingList; と入れてやればOKです。ちなみに BindingSource 抜き、つまり「DataGridView - SortableBindingList - オブジェクト」形式でも動きます。このへんはまだよくわかってなかったり(-_-; にわかは語る!

後で読む。ソートとフィルタの話。


コンピュータサイエンスは、間接層を設けることであらゆる問題が解決できるという信念に基づいた学問である。 -- Dennis DeBruler」Kent Beckがファウラーの「リファクタリング」で引用している言葉。この本で一番印象に残っている部分です(リファクタリングに関係ないしw)。この言葉、衝撃的でした。あらゆるというのは大げさだけど、ほぼその通りだし、それまでそういう視点に気づいていなかったし、気づいてなかった自分にも驚いたし。OSは偉大な間接層です。BindingSource や SortableBindingList はカシコイ間接層ですね。
ちなみにこの言葉の言いだしっぺは違うっぽかったり、続きがあったり、むしろ続きを言うための前置きっぽい言葉だったのかもしれません。Wikipediaバトラー・ランプソンの項ではデビッド・ホイーラーの言葉とされています。



今日のびっくりは「生まれ変わりはあるhttp://www.kisc.meiji.ac.jp/~metapsi/psi/7-3.htm
マジっすか!?