DataGridViewのチェック列のチェックで、セルクリックでもチェックのオン/オフができるようにする

チェック列にあるチェック欄は、チェック欄内をクリックすればオン/オフされますが、その外側のセルの余白?空白?のクリックでは反応しません。それの対応です。

イメージ

f:id:sutefu7:20200228164937p:plain

サンプルソース

using System.Windows.Forms;

/*
 * StackOverflow
 * Datagridview checkbox checked when clicking the cell
 * https://stackoverflow.com/questions/29398941/datagridview-checkbox-checked-when-clicking-the-cell
 * 
 * サンプル
 * Column1, DataGridViewCheckBoxColumn, HeaderText = Column1
 * Column2, DataGridViewTextBoxColumn, HeaderText = Column2, AutoSizeMode = Fill
 * 
 * あと行追加・削除とかも false にしたかな?
 * 
 */

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex <= -1 || e.RowIndex <= -1)
                return;

            // チェック列だったら
            if (dataGridView1.Columns[e.ColumnIndex].HeaderText == "Column1")
            {
                // null/true/false のいづれかなので、現在値が null だったら その逆の? true、現在値がどちらかだったら、逆のどちらかをセット
                var cell = dataGridView1.CurrentCell as DataGridViewCheckBoxCell;
                var isChecked = cell.Value is null ? true : (bool)cell.Value ? false : true;
                cell.Value = isChecked;
                
                dataGridView1.RefreshEdit();
                dataGridView1.NotifyCurrentCellDirty(true);
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            dataGridView1.RefreshEdit();
        }
    }
}