C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 173 を表示中)
■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;
  }
}
返信 編集キー/


管理者用

- Child Tree -