【c#】datagridviewでコマンドなどの処理でセルに値を入力した場合に、新規行を自動追加する方法

C#

datagridViewの処理で、ユーザーのキー操作ではなくコマンド等の処理でセルに値を入力した場合であっても新規行が自動追加されるようにする方法を解説します。

問題点

例えば、datagridViewのCellContentClickイベントに下記のような記述をした場合は新規行は自動追加されません。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    //列ヘッダーをクリックした場合などにキャンセルする。
    if (e.RowIndex < 0)
    {
        return;
    }
    DataGridView dtGrdVw = (DataGridView)sender;

    //対象列でない場合にキャンセルする。
    if (dtGrdVw.Columns[e.ColumnIndex].Name != "Column2")
    {
        return;
    }
    if (folderBrowserDialog1.ShowDialog() != DialogResult.OK)
    {
        return;
    }

    dtGrdVw[0, e.RowIndex].Value = folderBrowserDialog1.SelectedPath;
}

上記のプログラムソースを動かすと下記のような結果になります。

イメージ
イメージ

対処方法

下記のように、CurrentCellで操作対象のセルを制御し、NotifyCurrentCellDirtyを使えば対処できます。上記の問題点で提示したのと同じ操作をした場合でも新規行が追加されるようになります。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    //列ヘッダーをクリックした場合などにキャンセルする。
    if (e.RowIndex < 0)
    {
        return;
    }
    DataGridView dtGrdVw = (DataGridView)sender;

    //対象列でない場合にキャンセルする。
    if (dtGrdVw.Columns[e.ColumnIndex].Name != "Column2")
    {
        return;
    }
    if (folderBrowserDialog1.ShowDialog() != DialogResult.OK)
    {
        return;
    }

    dtGrdVw.CurrentCell = dtGrdVw[0, e.RowIndex];
    dtGrdVw.CurrentRow.Cells[0].Value = folderBrowserDialog1.SelectedPath;
    dtGrdVw.NotifyCurrentCellDirty(true);
    dtGrdVw.NotifyCurrentCellDirty(false);
}

上記のソースで、問題点で紹介した操作を同じことをすると今度は新規行が自動追加されます。

イメージ

以上となります。参考になれば幸いです。

タイトルとURLをコピーしました