|
カテゴリ:C#
【環境】
OS:Windows 7 64bit VS:Visual Studio 2008 SP1 言語:C# 【背景】 DataGridViewのDataSourceとして,DataTableを使っています。 DataTableの最終行には,列の合計を表示する仕様になっています。 この状態で,DataGridViewの列ヘッダをクリックし,ソートしたところ,「合計」行もソートされ表の上部に移動してしまいました。 *列2でソートしたところ,合計行が最上位になってしまいました。 仕様では,「合計」行は常に最終行でなければなりません。 そこで,この仕様を実現する方法を考えました。 【実現方法】 DataGridViewのDataSourceとしてDataTableを設定している場合, DataTableのDefaultViewを使うと簡単にソートおよびフィルターをかけることができます。 列ヘッダを選択したときのソートのモードを「自動」から「プログラミング」へ変更すれば, 列ヘッダをクリックされたときにプログラミングによりDefaultViewのソート条件を設定し,ソートを実行することができます。 なお,DefaultViewは複数列をキーにしてソートすることができます (この場合,列番号の若い方から優先されます)。 そこで,DataTableに「合計」行を最終行に固定するためのフラグデータを設定する列を追加し, フラグデータを主キー,ユーザが選択した列を副キーとしてソートすることで,「合計」行を最終行に固定することができます。 【サンプルコード】 [Form1.cs] using System; using System.Data; using System.Windows.Forms; namespace DataGridSample { public partial class Form1 : Form { public Form1() { InitializeComponent(); Random random = new Random(); // サンプルデータ生成用 DataTable table = new DataTable(); // DataGridView1のデータソース table.Columns.Add("列0", typeof(bool)); // 「合計」行を最下位に固定するためのフラグ table.Columns.Add("列1", typeof(string)); table.Columns.Add("列2", typeof(double)); table.Columns.Add("列3", typeof(double)); double dblTotal2 = 0; double dblTotal3 = 0; for (int index = 0; index < 5; index++) { DataRow row = table.NewRow(); row["列0"] = false; row["列1"] = index.ToString(); row["列2"] = random.Next(45, 95); row["列3"] = random.Next(30, 60); dblTotal2 += (double)row["列2"]; dblTotal3 += (double)row["列3"]; table.Rows.Add(row); } DataRow rowTotal = table.NewRow(); // 「合計」行 rowTotal["列0"] = true; // 合計行のみtrueにする rowTotal["列1"] = "合計"; rowTotal["列2"] = dblTotal2; rowTotal["列3"] = dblTotal3; table.Rows.Add(rowTotal); dataGridView1.DataSource = table; dataGridView1.Columns["列0"].Visible = false; // 非表示 // 列ソートの「自動」モードを解除 // → 「プログラミング」モードへ foreach (DataGridViewColumn col in dataGridView1.Columns) { col.SortMode = DataGridViewColumnSortMode.Programmatic; } } // dataGridView1列ヘッダクリック時のイベント // → dataGridView1.DataSourceのDefaultViewを使ってソート private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { DataTable table = (DataTable)dataGridView1.DataSource; // データソースの取得 // 選択した列が降順ソートされていた場合:昇順ソート // 合計行固定用のフラグも昇順ソートなので,Sortに設定する文字列はカンマでつなぐだけでOK if (dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == SortOrder.Descending) { table.DefaultView.Sort = "列0, " + dataGridView1.Columns[e.ColumnIndex].Name; dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending; } // 選択した列が降順ソートされていない場合:降順ソート // 合計行固定用のフラグは昇順ソートなので列Oの後に「ASC」と追加 // ソートする列名の後には,降順ソートを表す「DESC」を追加 else { table.DefaultView.Sort = "列0 ASC, " + dataGridView1.Columns[e.ColumnIndex].Name + " DESC"; dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending; } } } } お気に入りの記事を「いいね!」で応援しよう
最終更新日
2010年03月16日 05時45分41秒
コメント(0) | コメントを書く
[C#] カテゴリの最新記事
|