C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 149 を表示中)
■87160 / )  Re[1]: DataGridViewCheckBoxCellについて
□投稿者/ 魔界の仮面弁士 (1646回)-(2018/04/18(Wed) 09:46:24)
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
}
返信 編集キー/


管理者用

- Child Tree -