【C#】C#のdatagridviewに追加したボタンがクリックされた時の処理を追加するには

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

【動画】C#のdatagridviewにAccessのテーブルデータとボタンを表示させる実際の動き

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


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#\0021\0021.mdb" />

    </appSettings>
</configuration>

以上のコードは、App.configファイルのコードです。

今回は「C:\work\10_勉強\21_C#\0021」配下にある「0021.mdb」というAccessのデータベースファイルを使っています。

なので、App.configファイルのコードについては、以下の内容をご覧ください。

参考 App.configのコードTech-vb.com

フォームのコード

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

namespace wfcs_0022
{
    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();
            }

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

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

            // ボタンに「詳細」のテキストを追加する
            column.Text = "詳細";

            // ボタンにテキストを表示させるように設定する
            column.UseColumnTextForButtonValue = true;

            // 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 == "確認")
            {

                // クリックされたのがボタンの場合(ボタン列の場合)

                // 確認メッセージを出力する
                MessageBox.Show($"クリックしたボタンの行は{e.RowIndex + 1}行目です");
            }
        }
    }
}

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

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

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

注目すべきコード①

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

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

コードの説明

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

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

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

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

注目すべきコード②

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

            if (dataGridView1.Columns[e.ColumnIndex].Name == "確認")
            {

                // クリックされたのがボタンの場合(ボタン列の場合)

                // 確認メッセージを出力する
                MessageBox.Show($"クリックしたボタンの行は{e.RowIndex + 1}行目です");
            }

コードの説明

以上のコードは、クリックされたのがボタンの列なのかを判定し、ボタンの列の場合は確認メッセージを出力する処理のコードです。

ボタンがクリックされた場合にこの条件に合致するので、93行目でボタンがクリックしたときに行いたい「確認メッセージの出力処理」を行っています。

動作確認

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

最後に

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

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

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

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

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

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