忘れないようにめもっとくためのWiki。C#とかTFSを中心に、たまにiPhone開発をちょこっと・・・

×


データバインド時のソートに対応したチェックボックス列

非バインド列としてチェックボックス列を、バインド列としてデータを用意した場合、DataGridViewでソートを行うと、チェックが消えてしまう現象が発生します。
この件に関して、MSDNに以下の記述がありました。
MSDN 「Windows フォーム DataGridView コントロール内の列の並べ替えモード
バインド列非バインド列の両方を含む DataGridView コントロールを並べ替えるときは、非バインド列の値を自動的に保持できません
これらの値を保持するには、VirtualMode プロパティに true を設定し、CellValueNeeded イベントと CellValuePushed イベントを処理して、仮想モードを実装する必要があります。
詳細については、「方法 : Windows フォーム DataGridView コントロールで仮想モードを実装する」を参照してください。
バインド モードでの非バインド列による並べ替えはサポートされません。
VirtualModeを使用しないでチェックボックスを使用する場合は、以下の手順で実現可能です。
  1. データベースから取得後のDataTableに、Boolean型の列を追加する。
  2. 列を追加したDataTableを、DataGridViewにバインドする。
  3. チェックボックスの表示列を先頭にする。

【実行例】


// DataGridView dataGridView1;

// DataGridViewを更新
public void UpdateDataGridView()
{
    /* DataTable dataTable1 = データ */

    // チェックボックスの列を追加
    DataColumn columnCheck = new DataColumn("columnCheck", Type.GetType("System.Boolean"));
    dataTable1.Columns.Add(columnCheck);

    // DataTableをDataGridViewにバインド
    this.dataGridView1.DataSource = dataTable1;

    // 並べ替えモードを自動に設定
    this.dataGridView1.Columns["columnCheck"].SortMode = DataGridViewColumnSortMode.Automatic;

    // 表示位置を一番左に設定
    this.dataGridView1.Columns["columnCheck"].DisplayIndex = 0;
}

チェックボックス列の列ヘッダーにすべて選択用のチェックボックスを配置する

DataGridViewにチェックボックス列を配置した場合に、列ヘッダーにすべて選択用のチェックボックスを配置するためには、以下の実装を行います。
  1. Formの任意の場所に、すべて選択用のチェックボックスを非表示で配置する。
  2. DataGridViewのCellPaintingイベントで、列ヘッダーにチェックボックスを配置(描画)する。
  3. DataGridViewのCellClickイベントで、列ヘッダーのチェックボックスの状態を切り替える
  4. CheckBoxのCheckChangedイベントで、すべての行のチェック状態を切り替える

【実行例】


private CheckBox checkBoxAll = new System.Windows.Forms.CheckBox();

// 列ヘッダーにチェックボックスを表示
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    // 列ヘッダーのみ処理を行う。(CheckBox配置列が先頭列の場合)
    if (e.ColumnIndex == 0 && e.RowIndex == -1)
    {
        using (Bitmap bmp = new Bitmap(100, 100))
        {
            // チェックボックスの描画領域を確保
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.Clear(Color.Transparent);
            }

            // 描画領域の中央に配置
            Point pt1 = new Point((bmp.Width - checkBoxAll.Width) / 2, (bmp.Height - checkBoxAll.Height) / 2);
            if (pt1.X < 0) pt1.X = 0;
            if (pt1.Y < 0) pt1.Y = 0;

            // Bitmapに描画
            checkBoxAll.DrawToBitmap(bmp, new Rectangle(pt1.X, pt1.Y, bmp.Width, bmp.Height));

            // DataGridViewの現在描画中のセルの中央に描画
            int x = (e.CellBounds.Width - bmp.Width) / 2;
            int y = (e.CellBounds.Height - bmp.Height) / 2;

            Point pt2 = new Point(e.CellBounds.Left + x, e.CellBounds.Top + y);

            e.Paint(e.ClipBounds, e.PaintParts);
            e.Graphics.DrawImage(bmp, pt2);
            e.Handled = true;
        }
    }
}

// 列ヘッダーのチェックボックスを押したときに、すべて選択用のチェックボックス状態を切り替え
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex == -1)
    {
        checkBoxAll.Checked = !checkBoxAll.Checked;
    }
}

// すべての行のチェック状態を切り替える
private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        row.Cells[0].Value = checkBoxAll.Checked;
    }
}

このページへのコメント

canada goose
http://www.darinkamontano.com/
http://www.awfmmellowtouch.net/
http://www.rajasthantour-travels.com/
[url=http://www.awfmmellowtouch.net/]canada goose jacket[/url]

0
Posted by canada goose jacket 2013年12月22日(日) 07:33:31 返信

canada goose
http://www.darinkamontano.com/
http://www.awfmmellowtouch.net/
http://www.rajasthantour-travels.com/
[url=http://www.darinkamontano.com/]canada goose sale[/url]

0
Posted by canada goose sale 2013年12月20日(金) 17:49:07 返信

cNbqGo <a href="http://lkvcqxpejjoh.com/">lkvcqxpejjoh</a>, [url=http://wilmqjowycbo.com/]wilmqjowycbo[/url], [link=http://uyimdhnaogtq.com/]uyimdhnaogtq[/link], http://gbjmgjjjxdcp.com/

0
Posted by fzaoczgpkmc 2013年11月19日(火) 23:53:19 返信

43CZq6 <a href="http://afkhejdolduc.com/">afkhejdolduc</a>, [url=http://zxlpqhgdxtpi.com/]zxlpqhgdxtpi[/url], [link=http://eaufvywdmbxh.com/]eaufvywdmbxh[/link], http://qaznmsfxrkcz.com/

0
Posted by iccwdt 2013年11月14日(木) 16:00:09 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

Menu

プログラミング

TFS 2010

プロセステンプレートの作成

開発環境

メンバーのみ編集できます