トップ回答者
DataView.Sort指定によるDataGridViewへの反映について

質問
-
お世話になっております。
VB.NETでフォームアプリを作成しています。
DataGridViewとDataSet(DataTable1つ)のオブジェクトが1つずつあり、バインドしています。
(DataGridView オブジェクトのDataSource = DataSetのオブジェクト、
DataGridView オブジェクトのDataMember = DataSetのオブジェクト内のテーブルオブジェクト)このグリッド(DataGridView)のある列についてカスタマイズした並べ替え(ソート)を行いたいので
該当ColumnのSortMode = Programmatic
とし、
ColumnHeaderMouseClick イベントに、次のようなコードを記載しました。Private Sub datagridview1_ColumnHeaderMouseClick(...) Handles ....
If e.ColumnIndex = 0 Then
Dim dt As System.Data.DataTable = CType(datagridview1.DataSource, System.Data.DataSet).Tables(0)Select Case datagridview1.Columns(0).HeaderCell.SortGlyphDirection
Case SortOrder.None, SortOrder.Descending
dt.DefaultView.Sort = "Column1 ASC"
datagridview1.Columns(0).HeaderCell.SortGlyphDirection = SortOrder.Ascending
Case SortOrder.Acsending
dt.DefaultView.Sort = "Column1 DESC"
datagridview1.Columns(0).HeaderCell.SortGlyphDirection = SortOrder.Descending
End Select
End If
End Subグリッドの該当列(一番左)のヘッダをクリックすると
上記のコードを通過し、ヘッダに表示されるグリフ(記号)も表示が切り替わります。しかし、肝心のグリッド表示自身の並び替えがされません。
DataViewを更新したあと、
グリッドの中身は何かメソッドを呼ばないと表示を更新(反映)しないのでしょうか?ご存知の方、ご教示のほどお願い致します。
回答
-
DataMemberを使わずに、DataSourceにDataTableもしくはDataViewをセットすればうまくいくはずです。もしくはBindingSourceを使います。通常はBindingSourceを使うのがお勧めです。バインディングうに関する多くの機能を提供してくれるからです。
Dim bs = new BindingSource(dataSet1, "Table1")
dataGridView1.DataSource = bsソートは、
CType(datagridview1.DataSource, BindingSource).Sort = "Column1 ASC"
#上記のコードは空で書いているので間違いがあったらごめんなさい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク koma_deko 2010年12月27日 8:29
すべての返信
-
DataMemberを使わずに、DataSourceにDataTableもしくはDataViewをセットすればうまくいくはずです。もしくはBindingSourceを使います。通常はBindingSourceを使うのがお勧めです。バインディングうに関する多くの機能を提供してくれるからです。
Dim bs = new BindingSource(dataSet1, "Table1")
dataGridView1.DataSource = bsソートは、
CType(datagridview1.DataSource, BindingSource).Sort = "Column1 ASC"
#上記のコードは空で書いているので間違いがあったらごめんなさい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク koma_deko 2010年12月27日 8:29
-
trapemiya 様
ご返信が遅くなりまして、申し訳御座いませんでした。
どうも有り難う御座いました。
おかげさまで
BindingSourceを使うことで、無事グリッドのソートが出来ました。DataGridViewのプロパティブラウザで
なぜだかDataSourceにテーブルやビューを指定できず、
DataSetのオブジェクト丸ごとしか選択できませんでした。それもあって、BindingSourceを利用すべく、
ご教示いただいたようにForm.Loadイベントで、
bs = New BindingSource(dataset1, "Table1")
datagridview1.DataSource = bs
として、データセットとグリッドとをバインドさせ、
datagridmain1_ColumnHeaderMouseClickイベントで
グリフの向きに応じて
bs.Sort = "Column1 ASC" または bs.Sort = "Column1 DESC"
を行うようにして、うまくソートが動くようになりました。