DataGridViewで数値順に並び替える [DataGridView]
----------------------------------------------------------
(開発・実行環境)
Microsoft Visual Studio 2005 Tools for Applications
Microsoft Visual Basic 2005
----------------------------------------------------------
DataGridViewのColumnヘッダをクリックしてソートする際、文字列順に並び変わる。
これを、特定のColumnにおいて、数値順に並び替えたい。
CellStyleのFormatを数値にしても効いてくれない。
どうもDataGridView全体で制御されてるみたい?
この場合、SortCompare イベントを使って解決。
イベント内に以下のコードを書くのみ(適宜カスタムしてね)。
If e.Column.Index = (特定のColumn) Then
e.SortResult = CInt(e.CellValue1) - CInt(e.CellValue2)
e.Handled = True
End If
たったこれだけなんて・・・。
このイベントは秀逸だわ。
参考)
http://dobon.net/vb/dotnet/datagridview/customsort.html
http://oshiete1.goo.ne.jp/qa3026757.html
(追記)
ただし、上記の e.SortResult プロパティはInteger の値を設定するため、値が大きいものについてはオーバーフローするので注意を要する。
DataGridViewのイベント [DataGridView]
----------------------------------------------------------
(開発・実行環境)
Microsoft Visual Studio 2005 Tools for Applications
Microsoft Visual Basic 2005
----------------------------------------------------------
DataGridView上のデータの条件によって、
グリッドの色を変えたり、データを別のとこに表示したりする際に
使うイベントについて。
一番使えるのはDataGridView.CellEnterイベントでしょうか。
今回やりたかったのは、行のデータを明細部に表示するといったもので、
はじめはDataGridView.RowEnterイベントでやろうと思ってて。
ただ、RowEnterだと、画面ロード時にNullReferenceのエラーが出るの。
なぜか。
CellEnterイベントは「現在のセルが変更になったとき発生」。
RowEnterイベントは「行が入力フォーカスを受け取り、現在の行になる前に発生」。
似たような名前なのに違うタイミングで起こるなんて・・・紛らわしぃ。。。
まぁFormの初期化をちゃんとしとけば大丈夫なんだろうけど・・・
CellEnterで済ませました。
しかし、DataGridViewはメンバが多いから大変だぁ~~。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview_members.aspx
DataGridViewを使った検索データの表示と削除 [DataGridView]
----------------------------------------------------------
(開発・実行環境)
Microsoft Visual Studio 2005 Tools for Applications
Microsoft Visual Basic 2005
----------------------------------------------------------
(課題)
DataGridViewにDBの検索結果を表示する。
また、それをクリアする。
(解決法)
DB内の検索データをDataGridViewに表示する際、
DataSourceを使わずに行なった。
DataSourceを当ててる場合は、DataSourceをClearか何か
すれば良いらしいけど。
表示は、検索結果の入ったDataSetを一度配列に入れて、
その配列内のデータを行毎にDataGridViewに流す。
(配列はDataGridViewのColumn数を要素数とする)
これを行数回分まわす。
(グリッドのColumu数が検索結果の列の数と違う場合は1列ずつ入れました。。)
削除する場合は一気にClearできなかったので、
行数を数えて、その回数分行削除処理をまわす。
ちなみにこのとき使ったメソッドは、
「DataGridView.Rows.RemoveAt()」。
DataGridView.Rows.Remove()じゃダメやった。。
行を”コレクション”から削除するメソッドなんだけど、
うまく全行消えてくれず。。。
たぶん、消した分だけコレクションが変化した(行数が減った)からだと思うけど。。
(しかし、コレクションってなんかいまいちピンとこん。。。)
ちなみに以下が”上手くいかなかった”ソース。。
(p_GrdはDataGridViewのオブジェクト)
'グリッドの行数の取得
Dim rowCnt As Integer = p_Grd.Rows.Count
行の削除()
For Each row As DataGridViewRow In p_Grd.Rows
If row.Cells(0).Value.ToString IsNot Nothing Then
p_Grd.Rows.Remove(row)
End If
Next
行の位置を指定して削除する「RemoveAt()」メソッドを使いましたとさ。
ちなみにグリッドデータを削除する場合は下から(行番号の大きい方から)消すよう注意!
消してったら行数減ってくからね。