【C#】C#のdataGridViewに追加したチェックボックスがクリックされた時の処理を追加するには

この記事では、C#のdataGridViewに追加したチェックボックスがクリックされた時の処理を追加する方法についてご説明します。

【動画】C#のdataGridViewに追加したチェックボックスがクリックされた時の処理を追加する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


datagridviewに追加されたチェックボックスをクリックすると、メッセージボックスが表示されています。

コードの流れ

STEP.1
dataGridViewのクリック時に発生するイベントプロシージャを追加する
dataGridViewのクリック時に発生するイベントを追加します。
今回はCellContentClickイベントプロシージャを追加しています。
STEP.2
dataGridViewのチェックボックスクリック時に、どの列がクリックされたかを判定する
dataGridViewのチェックボックスクリック時に、どの列がクリックされたかを判定します。
この判定は、クリックされた列がチェックボックスの列なのか、チェックボックス列以外なのかを判定します。
チェックボックスの列なら、チェックボックスをクリックしたときに行う処理を続けます。

フォームとAccessのテーブルデータの例

今回は次のフォームとAccessのテーブルデータを用意しました。

フォーム上には処理を開始する実行チェックボックスとAccessのテーブルデータとチェックボックスを表示させるdataGridViewが設置されています。

なお、今回の本題は「datagridviewに追加したチェックボックスがクリックされた時の処理を追加する」なので、datagridviewにAccessのテーブルデータとチェックボックスを表示させる説明は省略します。

datagridviewにAccessのテーブルデータとチェックボックスを表示させる説明については、以下の記事を参考にしてください。

【C#】C#のdatagridviewにAccessのテーブルデータとチェックボックスを表示させるには

今回の説明で使っているソースコードは、以上の記事で紹介したソースコードをそのまま使っています。

C#のコード(例)

App.configのコード

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <appSettings>
        <!-- 接続文字列 -->
        <add key="DBConnString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" />

        <!-- Accessのデータベースファイルのパス -->
        <add key="DBPath" value="C:\work\10_勉強\21_C#\0028\0028.mdb" />

    </appSettings>
</configuration>

注目すべきコード①

最初に見て頂きたいのは8行目と11行目です。

8行目は、Accessのデータベースファイルに接続するのに必要な接続文字列を「DBConnString」というキーに設定しているコードです。

11行目は、Accessのデータベースファイルのパスを「DBPath」というキーに設定しているコードです。

「DBConnString」と「DBPath」のキーの値をフォーム側のコードが参照して使います。

フォームのコード

using System;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
using System.Configuration;

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

        private void button1_Click(object sender, EventArgs e)
        {
            // DataGridViewのデータソースをnullに設定して表示されているデータをクリアする
            dataGridView1.DataSource = null;

            // DataGridViewの列をクリアして表示されている列を削除する
            dataGridView1.Columns.Clear();

            // App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数「connStrTemplate」に格納する
            string connStrTemplate = ConfigurationManager.AppSettings["DBConnString"];

            // App.configのappSettingsタグ内に記述した「DBPath」のキーの値を取得して変数「dbPathStr」に格納する
            string dbPathStr = ConfigurationManager.AppSettings["DBPath"];

            // connStrTemplateの{0}の部分を、「dbPathStr」の値に置き換える
            string connectionString = string.Format(connStrTemplate, dbPathStr);

            // OleDbConnectionインスタンスを生成する
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                // Accessのデータベースファイルに接続する
                connection.Open();

                // SQLクエリを作成します
                string query = "SELECT * FROM t_syain";

                // OleDbCommandインスタンスを生成する
                using (OleDbCommand command = new OleDbCommand(query, connection))
                {
                    // OleDbDataAdapterインスタンスを生成する
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {
                        // DataTableインスタンスを生成する
                        DataTable dt = new DataTable();

                        // データテーブルにデータを格納する
                        adapter.Fill(dt);

                        // DataGridViewにデータを表示する
                        this.dataGridView1.DataSource = dt;
                    }
                }

                // Accessのデータベースファイルの接続を閉じる
                connection.Close();
            }

            // DataGridViewCheckBoxColumnのインスタンスを生成する
            DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();

            // 列のヘッダの名前に「チェック」の文字列を設定する
            column.Name = "チェック";

            // dataGridViewにチェックボックスの列を追加する
            dataGridView1.Columns.Add(column);

            // チェックボックスの列の表示位置を列の1列目(インデックスが0)に設定する
            dataGridView1.Columns["チェック"].DisplayIndex = 0;
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridView1.Columns[e.ColumnIndex].Name == "チェック")
            {
                // チェックボックスの列がクリックされた場合

                // チェックボックスの値を取得する
                bool isChecked = (bool)dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue;

                if (isChecked)
                {
                    // チェックボックスのチェックが付けられた場合

                    // 確認メッセージを出力する
                    MessageBox.Show($"チェックを付けました");
                }

                else
                {
                    // チェックボックスのチェックが外された場合

                    // 確認メッセージを出力する
                    MessageBox.Show($"チェックを外しました");
                }
            }
        }
    }
}

以上のコードの1行目から74行目までは以下の記事のソースコードをほぼそのまま使っています。

参考 フォームのコードTech-vb.com

なので、今回は1行目から74行目までの説明は省略し、76行目のdatagridviewのCellContentClickイベントプロシージャの行から説明します。

注目すべきコード①

最初に見て頂きたいのは76行目です。

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

コードの説明

以上のコードは、datagridviewのセルの内容がクリックされた時に呼び出されるイベントプロシージャです。

dataGridViewのボタンがクリックされると、CellContentClickイベントプロシージャが呼び出されます。

ただし、CellContentClickイベントプロシージャが呼び出されるには、以下のdatagridviewのプロパティ設定で、datagridviewのイベント設定を行う必要があります。

以上の設定をしておかないと、CellContentClickイベントプロシージャが呼び出されないので必ず以上の設定を行うようにしてください。

注目すべきコード②

次に見て頂きたいのは78行目です。

            if (dataGridView1.Columns[e.ColumnIndex].Name == "チェック")

コードの説明

以上のコードは、クリックされたのがチェックボックスの列なのかを判定する処理のコードです。

e.ColumnIndexには何列目がクリックされたのかその位置を返すので、その値をColumnsプロパティに渡すことで、Nameから列名を取得することができます。

なお、チェックボックスの列は、accessのテーブルデータを表示した後に追加した列なので、今回の場合はe.ColumnIndexは3を返します。

注目すべきコード③

次に見て頂きたいのは83行目から99行目です。

                // チェックボックスの値を取得する
                bool isChecked = (bool)dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue;

                if (isChecked)
                {
                    // チェックボックスのチェックが付けられた場合

                    // 確認メッセージを出力する
                    MessageBox.Show($"チェックを付けました");
                }

                else
                {
                    // チェックボックスのチェックが外された場合

                    // 確認メッセージを出力する
                    MessageBox.Show($"チェックを外しました");
                }

コードの説明

以上のコードは、チェックボックス列のチェックボックスのチェック状態を変更した際に、チェックボックスの状態を知らせる処理のコードです。

コードの詳細

83行目のコードでは、チェックボックスのチェックを付けたか外したかの状態を取得しています。

dataGridView1[e.ColumnIndex, e.RowIndex]でクリックされたセルの位置が特定され、EditedFormattedValueプロパティがセルの状態を返します。

チェックボックスのチェックを付けたか外した場合、チェックを付けたらtrueをチェックを外したらfalseを返します。

EditedFormattedValueプロパティからチェック有無(trueかfalseか)を取得できるのですが、EditedFormattedValueプロパティが返す値はobject型なので、(bool)を記述してbool型に変換します。

bool型に変換した値を変数isCheckedに格納します。

85行目のコードでは、83行目で取得したチェックボックスの状態を判定し、trueの場合は90行目の処理を、falseの場合は98行目の処理を行います。

動作確認

datagridviewで表示されたチェックボックスをクリックすると以下のメッセージボックスが出力されます。

チェックを付けた場合

チェックを外した場合

最後に

この記事では、C#のdatagridviewに追加したチェックボックスがクリックされた時の処理を追加する方法についてご説明しました。

この記事では、C#のdatagridviewに追加したチェックボックスがクリックされた時の処理を追加したいときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら