DataGridView ブログトップ

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()」メソッドを使いましたとさ。

 

ちなみにグリッドデータを削除する場合は下から(行番号の大きい方から)消すよう注意!

消してったら行数減ってくからね。


DataGridView ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。