000000 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

お気楽プログラマーのトラブルいろいろ

お気楽プログラマーのトラブルいろいろ

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

キーワードサーチ

▼キーワード検索

プロフィール

ふわふわふふふ

ふわふわふふふ

カレンダー

楽天カード

お気に入りブログ

まだ登録されていません

コメント新着

お気楽主婦@ Re:助かりました(02/09) 昔の記事ですが、お役に立ててよかったで…
nick@ 助かりました 私もx64とx86で開発してます。 ありがと…
excel 2010 新機能 マクロは便利です!@ excel 2010 新機能 vbaは便利です! vbaをマスターする簡単な方法は、マクロを…

フリーページ

ニューストピックス

2010年03月16日
XML
カテゴリ:C#
【環境】

 OS:Windows 7 64bit
 VS:Visual Studio 2008 SP1
 言語:C#

【背景】

DataGridViewのDataSourceとして,DataTableを使っています。
DataTableの最終行には,列の合計を表示する仕様になっています。

この状態で,DataGridViewの列ヘッダをクリックし,ソートしたところ,「合計」行もソートされ表の上部に移動してしまいました。

sort2.jpg

*列2でソートしたところ,合計行が最上位になってしまいました。


仕様では,「合計」行は常に最終行でなければなりません。
そこで,この仕様を実現する方法を考えました。

【実現方法】

DataGridViewのDataSourceとしてDataTableを設定している場合,
DataTableのDefaultViewを使うと簡単にソートおよびフィルターをかけることができます。

列ヘッダを選択したときのソートのモードを「自動」から「プログラミング」へ変更すれば,
列ヘッダをクリックされたときにプログラミングによりDefaultViewのソート条件を設定し,ソートを実行することができます。

なお,DefaultViewは複数列をキーにしてソートすることができます
(この場合,列番号の若い方から優先されます)。

そこで,DataTableに「合計」行を最終行に固定するためのフラグデータを設定する列を追加し,
フラグデータを主キー,ユーザが選択した列を副キーとしてソートすることで,「合計」行を最終行に固定することができます。

sort3.jpg


【サンプルコード】

[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#] カテゴリの最新記事



© Rakuten Group, Inc.