緋ノヒカリ

日記や雑記を載っけていきたいと思っています。 併せてゲームや本のことなども。 よろしく。

Category: スポンサー広告   Tags: ---

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Category: プログラム   Tags: ---

Comment: 0  Trackback: 0

C# DataGridView にカスタムクラスをバインドした際のソート

また微妙なツールを作ってるのだけど、WindowsForm でやってて、DataGridView にカスタムクラスのコレクションをバインド出来ることを知って、試しに色々やってた。

で、やっぱ DataGridView を使うなら、ヘッダクリックで内容を自動的にソートしたい。

でも、データテーブルとかをバインドした場合は自動的に出来るヘッダクリックなソートが、カスタムオブジェクトをバインドした際には出来なかった。

で、色々調べたら、まんまな回答がWEBに落ちてた。さすが google 先生。

以下が参考にしたサイト。

その1.(.Net)DataGridViewでカスタムクラスをバインドした状態でソートを行う。
その2.リフレクションを利用したソート(メモ)

最初は意味がわからなかったけど、じっくりと内容を確認。

要するに、カスタムクラスのコレクションを System.Collections.Generic.List.Sort にソートさせると言う事で、カスタムクラスのコレクションを DataGridView にバインドしておいて、そのデータソースに対してソート処理を行う。
その後 DataGridView をリフレッシュ。

文字で読むと良くわからない感じだけど、実際書いてみればよくわかる。

ここで実際コードを記載しても構わないのだけど、ある程度自分専用、というか、カスタムクラス専用のコードになるから若干意味が薄いのかとも思う。

その1.の方は、リンク先のページに書いてあるコードを全部コピペすればコンパイルは通る。
その2.の方は、若干弄ってあげないとコンパイル通らないけど、両方見比べたら大体意味は分かるはず。

その1.は、その2.を元に書きなおしたみたいだけど、個人的にはその1.のほうが分かりやすかった。

このコード達のいい所は、リフレクションを利用してカスタムクラスの公開プロパティ毎にソートルールを設定出来るところだと思う。
つまり、該当するソート項目が、文字だろうが数値だろうが別のクラスだろうが、好きにルールを決め手ソートができる。

これ一個あれば、DataGridView でのソートだけではなく、単独で独自クラスのコレクションに対してもソートが可能だから、覚えておけば他でも使えそう。

単純にコレクションをソートするだけだと、LinqToObjectのほうが楽なきもするけども。



他にもカスタムクラスをバインドした際に面倒な事とか色々あったんだけど、とりま無理くり解決した。


例えば、カスタムクラスをバインドした場合、というか、データバインドされた DataGridView の Row[ 0 ].Visible = false に設定できないとか。


何がやりたかったかというと、DataGridView の表示されているリストを、正規表現を使用してフィルタリングしたかった。

フィルタリングだから、当然元のデータソースであるカスタムクラスのコレクションからは削除せず、表示される行だけに制限をかけるということで、単純にフィルターだけならかかったんだけど、フィルタ条件にマッチしなくて、結果表示行数がゼロ行になるような場合にエラーが発生する。

普通のDataSetとか使ってたら、Filterとか使えるんだけど、今回は正規表現とかの絡みで、面倒なあまり調べる努力を怠った。

どうやって無理矢理解消したかというと、単純で、データ保持の為のコレクションに Visible をプロパティとして持たせ、DataGridView にバインドする際、その Visible を見て新しいインスタンスのコレクションを返すメソッドをかましてバインド。
フィルタリングさせるたびに再バインド。

こんな感じ。


///
/// DataGridViewに表示するモノのみコレクションとして返す
///

///
///
private LogFileInfoCollection GetViewList ( LogFileInfoCollection source )
{
LogFileInfoCollection ret = new LogFileInfoCollection ();
foreach ( var v in source )
{
if ( v.Visible ) ret.Add ( v );
}
return ret;
}



LogFileInfoCollection ってのがおれが勝手に作ったクラスのコレクション。

新しいインスタンスを作って source の Visible が True なアイテムのみコレクションに追加して返す。
あとはこれをバインドするだけ。

dgvLogList.DataSource = GetViewList ( logFiles )



本来ならきちっと BindingSource を使って綺麗に実装するべきなんだろうけど、なんだか色々面倒で、上のようなやっつけコードに。

まぁしょぼいツールだし、とりあえずいいかな、と。

Comments


プロフ

AIL

Author:AIL
AIL [ Web ]

あまり更新できないかと思われますが適当にどうぞ。

リンクフリーです。希望があれば相互リンク賜ります。

↓Webサイトも持ってます気になる方は是非
→浸帰牢へ行ってみる
PS2ジョジョの攻略とかありますよ。
MoEの話題専用ブログも。
→MoEを遊んでる記録
あとついったー。
→ついったー


---


過去ログ
自分用

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。