|
■No87121 (MTK さん) に返信 > チェックボックスだけでなくセルをクリックしても、チェックが入るようにしたいと思い、
DataGridViewCheckBoxCell の ContentBounds プロパティが返す範囲を 「チェックボックス部」から、「セル全体」に広げてしまった方が手っ取り早いかも。
public partial class Form1 : Form { public Form1() { InitializeComponent();
// 今回の実験対象となる DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill }; dgv.AllowUserToAddRows = false; dgv.ColumnCount = 5; dgv.RowCount = 10;
changeReceive = new List<CheckBox>(); for (int c = 0; c < dgv.ColumnCount; c++) { // No87121 「DataGridViewの1行目にチェックボックスを設定する」 dgv.Columns[c].HeaderText = "列" + c; dgv[c, 0] = new CheckBoxCell();
// 【デバッグ用】 // チェックボックスセルの状態を // 確認するためのチェックボックス var chk = new CheckBox() { Dock = DockStyle.Top }; Controls.Add(chk); changeReceive.Add(chk); chk.BringToFront(); } Controls.Add(dgv); dgv.BringToFront();
// 【デバッグ用】 // DataGridViewCheckBoxCell の状態が変化したら // それを CheckBox に伝える dgv.CellValueChanged += dgv_CellValueChanged; } DataGridView dgv; List<CheckBox> changeReceive;
// 【デバッグ用】 private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e) { var dgv = (DataGridView)sender; if (e.ColumnIndex >= 0 && e.RowIndex == 0) { var b = (bool)dgv[e.ColumnIndex, 0].Value; changeReceive[e.ColumnIndex].Checked = b; } }
#region DataGridViewCheckBoxCell の派生実装 private class CheckBoxCell : DataGridViewCheckBoxCell { public CheckBoxCell() : this(false) { } public CheckBoxCell(bool threeState) : base(threeState) { // データソースの既定の型を System.Boolean にしておく TrueValue = true; FalseValue = Value = false; } /// <summary>セルの余白部でもチェックボックスを反応させる</summary> protected override Rectangle GetContentBounds(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex) { // return base.GetContentBounds(graphics, cellStyle, rowIndex); var cdr = base.DataGridView.GetCellDisplayRectangle(base.ColumnIndex, rowIndex, false); return new Rectangle(0, 0, cdr.Width, cdr.Height); } /// <summary>クリックされたら即時にチェックボックスの状態を変更</summary> protected override void OnContentClick(DataGridViewCellEventArgs e) { base.OnContentClick(e); base.DataGridView.EndEdit(); } /// <summary>チェックボックスをダブルクリックした場合にも反応させる</summary> protected override void OnContentDoubleClick(DataGridViewCellEventArgs e) { // base.OnContentDoubleClick(e); this.OnContentClick(e); } } #endregion }
|