■99882 / ) |
Re[1]: DataGridViewのソート処理について |
□投稿者/ 魔界の仮面弁士 (3402回)-(2022/06/15(Wed) 17:34:00)
|
■No99880 (はるぱぱ さん) に返信 > 分類:[.NET 全般] 言語指定が無いので、とりあえず C# で書きます。
> SQLServerの仕様のようですがこれを1〜順に昇順で最後にNULLが来るようにするにはどのようにすればいいでしょうか。 DataGridView のソート仕様は、SQL Server の仕様とは無関係ですよ。
ADO.NET をお使いとは思いますが、DataGridView が見ているのは あくまでも DataTable のデータに過ぎません。
そしてその DataTable の内容が CSV から取り込まれたものなのか、 SQL Server から取り込まれたのかといった事情は、 DataGridView にとっては何の関係も無い事です。
SQL Server で NULL を末尾にしてソートする場合は ORDER BY num ASC の代わりに ORDER BY ISNULL(num,0x7fffffff) ASC のようにします。ちなみに Oracle の場合は、 ORDER BY num ASC NULLS LAST です。
> ヘッダー部のクリックによってソートが行えますが、 ソートができるかどうかは、DataSource 次第ですけれどね。
DataSource が指定されていない場合は、 SortCompare イベントを使ってカスタムソートを実装できます。 https://dobon.net/vb/dotnet/datagridview/customsort.html
DataSource を指定しつつ、カスタムソートを実装したい場合には、 独自ソート機構を持ったデータソースを用意する方法があります。 https://garafu.blogspot.com/2016/09/cs-sorablebindinglist.html
取りあえず今回は、DataTable や DataView がセットされているものと仮定します。 private DataTable CreateSampleTable() { var tbl = new DataTable(); tbl.PrimaryKey = new DataColumn[] { tbl.Columns.Add("id", typeof(int)) }; tbl.Columns.Add("num", typeof(int)); tbl.Rows.Add(1, 1000); tbl.Rows.Add(2, 3000); tbl.Rows.Add(3, DBNull.Value); tbl.Rows.Add(4, 2000); tbl.AcceptChanges(); return tbl; }
private DataTable tbl; private void Form1_Load(object sender, EventArgs e) { // 実際には SQL Server から取得してきたデータ tbl = CreateSampleTable();
// 型付 DataSet を使っているなら、バインド設定はデザイン時に行っても構わない dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = new DataView(tbl); // DataView のかわりに BindingSource でも可 // カスタムソートにしたい列は、Programmatic モードにしておく dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
// ソート用の『式列(Expression Column)』を追加する // これは DataGridView にはバインドしない(または該当列を Visible = false にしておく) dataGridView1.AutoGenerateColumns = false; tbl.Columns.Add("numASC", typeof(int), "ISNULL([num], " + int.MaxValue + ")"); tbl.Columns.Add("numDESC", typeof(int), "ISNULL([num], " + int.MinValue + ")"); }
// 列ヘッダーをクリックされたら、 private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { var dgv = (DataGridView)sender; var view = dgv.DataSource as DataView; if (view == null || e.ColumnIndex != 1) { return; }
// Programmatic 列がクリックされた場合は、代わりに「式列」でソートする var header = dgv.Columns[1].HeaderCell; if (header.SortGlyphDirection == SortOrder.Ascending) { view.Sort = "[numDESC] DESC"; header.SortGlyphDirection = SortOrder.Descending; } else { view.Sort = "[numASC] ASC"; header.SortGlyphDirection = SortOrder.Ascending; } }
|
|