DataGridView + SortableBindingList = 楽
久しぶりにC#、WinFormの話題。ただいまC#。WPF時代到来ですがWinFormです。
DataGridView にオブジェクトを載せると、列のヘッダをクリックしての自動ソートができなくてがっかりします。これをカイゼン!
VisualStudio2005 は、データベースのフロントエンドのようなアプリをコードを書かずに作れてしまう(無料の Express であっても!)めちゃくちゃスゴイ機能があります。本格的なアプリの礎にも、ちょっとしたツールにも便利に使えます。なにこの IDE の進化っぷりは!
データベースだと列ヘッダをクリックすると▼▲みたいなのが表示されて、列の内容でソートできます。コーディングレスでここまでできます。でも、オブジェクト(というより型ですが)を入れるとコードを書かないとソートできません。データベースは自動なのに、差別です!数行書けばいいだけなんだけど、データベースは書かなくてもいいのにって思うとものっっすごく面倒に感じます(^^;
カスタム データ バインド (第 2 部)
http://www.microsoft.com/japan/msdn/columns/winforms/winforms02182005.aspx
このMSDNの古い記事に、どんな型でもソート可能にする SortableBindingList
この記事のサンプルでは、なぜか記事本文に書いてあるいくつかのメソッドの実装が欠けてます。さらに、β時代のコードなのでそのままではビルドできず、直してビルドしてもシリアライズの形式が変わったのか、添付データは読めないのでゲームは遊べませんので、あしからず。
欠けてる部分の実装は http://www.thescripts.com/forum/thread441915.html の #7 で Bart Mermuys さんが投稿しています。ApplySortCore() が改悪されてるのが気になりますが。MSDN記事の肝はここに載っている2クラスなので、これだけ見れば元記事のサンプルは見なくてもOKです。ただし、MSDN記事のサンプルコードについてるEULAは目を通すのを忘れずに。
実際に使うには PropertyComparer
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
マジっすか!?