2019-09-08に投稿

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

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

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

ドラッグでの複数選択
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 &amp; Keys.Shift) == Keys.Shift)
                    {
                        return;
                    }

                    if ((Control.ModifierKeys &amp; 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に別のチェックボックスやコンボボックスを配置する要件なんて、
とりあえず需要があることだろうに標準で用意してほしいですよね。

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

ではでは。

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント