【C#】DataGridView の 行選択時にチェックボックスの状態を変更する(その2)

C#,開発

おはようございます。

前回のものを少し改良しました。

変更したのは主に下記の制御。

  • ドラッグでの複数選択
  • Shift または Ctrl を押しながらの選択
  • チェックボックスを直接チェックした場合の挙動

スポンサーリンク

プログラム

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SampleDataGridCheckbox
{
    /// <summary>
    /// サンプルフォーム
    /// </summary>
    public partial class Form1 : Form
    {

        /// <summary>
        /// 初期化処理
        /// </summary>
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Rows.Add(false, "テスト1", "テスト1");
            dataGridView1.Rows.Add(false, "テスト2", "テスト2");
            dataGridView1.Rows.Add(false, "テスト3", "テスト3");
            dataGridView1.Rows.Add(false, "テスト4", "テスト4");
            dataGridView1.Rows.Add(false, "テスト5", "テスト5");
            dataGridView1.Rows.Add(false, "テスト6", "テスト6");

            dataGridView1.ClearSelection();
        }

        /// <summary>
        /// データグリッドビューセルクリックイベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // ヘッダー以外
            if (e.RowIndex >= 0)
            {
                // クリックされた箇所を特定
                DataGridViewCell cell = dataGridView1.CurrentCell;
                if (cell.OwningColumn.Name == "Column1")
                {
                    if (cell.Value.ToString() == "False")
                    {
                        dataGridView1.Rows[e.RowIndex].SetValues(true);
                    }
                    else
                    {
                        dataGridView1.Rows[e.RowIndex].SetValues(false);
                    }
                }
                else
                {
                    if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
                    {
                        return;
                    }

                    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
                    {
                        return;
                    }

                    // Shift or Ctrl キーが押されていなければクリック行以外をクリア
                    dataGridView1.ClearSelection();
                    dataGridView1.Rows[cell.RowIndex].Selected = true;

                }
            }
        }

        /// <summary>
        /// データグリッドビュー選択変更イベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            // 選択されたセルを判定
            DataGridViewCell cell = dataGridView1.CurrentCell;
            if (cell.OwningColumn.Name != "Column1")
            {
                // 選択行のチェックボックスの状態を制御
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Selected)
                    {
                        dataGridView1.Rows[row.Index].SetValues(true);
                    }
                    else
                    {
                        dataGridView1.Rows[row.Index].SetValues(false);
                    }
                }
            }
        }

    }
}

起動してみる

GIFイメージ

GIFイメージ

SCREENPRESSOでGIF動画を撮ってみました。

まとめ

前回のものがちょっと納得いかなかったので改めて。

DataGridViewに別のチェックボックスやコンボボックスを配置する要件なんて、
とりあえず需要があることだろうに標準で用意してほしいですよね。

昨日以上にサクッとしてますが以上です。

ではでは。

スポンサーリンク


関連するコンテンツ

C#,開発C#,CSharp,DataGridView,プログラミング

Posted by doradora