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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87160 の関連記事表示

<< 0 >>
■87160  Re[1]: DataGridViewCheckBoxCellについて
□投稿者/ 魔界の仮面弁士 -(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
    }
記事No.87121 のレス /過去ログ149より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -