非バインド列としてチェックボックス列を、バインド列としてデータを用意した場合、DataGridViewでソートを行うと、チェックが消えてしまう現象が発生します。
この件に関して、MSDNに以下の記述がありました。
MSDN 「Windows フォーム DataGridView コントロール内の列の並べ替えモード
【実行例】

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

// 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にチェックボックス列を配置した場合に、列ヘッダーにすべて選択用のチェックボックスを配置するためには、以下の実装を行います。
【実行例】

- Formの任意の場所に、すべて選択用のチェックボックスを非表示で配置する。
- DataGridViewのCellPaintingイベントで、列ヘッダーにチェックボックスを配置(描画)する。
- DataGridViewのCellClickイベントで、列ヘッダーのチェックボックスの状態を切り替える
- 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]
canada goose
http://www.darinkamontano.com/
http://www.awfmmellowtouch.net/
http://www.rajasthantour-travels.com/
[url=http://www.darinkamontano.com/]canada goose sale[/url]
cNbqGo <a href="http://lkvcqxpejjoh.com/">lkvcqxpejjoh</a>, [url=http://wilmqjowycbo.com/]wilmqjowycbo[/url], [link=http://uyimdhnaogtq.com/]uyimdhnaogtq[/link], http://gbjmgjjjxdcp.com/
43CZq6 <a href="http://afkhejdolduc.com/">afkhejdolduc</a>, [url=http://zxlpqhgdxtpi.com/]zxlpqhgdxtpi[/url], [link=http://eaufvywdmbxh.com/]eaufvywdmbxh[/link], http://qaznmsfxrkcz.com/