ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# DataGridViewでの値のコピー&ペーストの実装

DataGridViewを快適に使えるようにするには値のコピペは必須だと思います。

そのあたり色々躓いたのでメモっておきます。

 

DataGridViewでセルを選択して、Ctrl + C でクリップボードへ値をコピーするのは実はデフォルトで可能になっているようです。

しかし Ctrl + V でペーストしようとしてもできません。
こちらは KeyDown イベントで実装する必要があります。

このような感じ。

private void dgv_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.V)
    {
        // クリップボードの文字列を取得
        string s = Clipboard.GetText();

        // 選択セルに反映
        this.dgv.CurrentCell.Value = s;
    }
}


ここまでは問題ありません。

しかしこちらを実装すると編集不可設定にしている列にもペーストできてしまいます。
そこで switch で列インデックスに応じてペーストするか分岐させます。

if (e.Control && e.KeyCode == Keys.V)
{
    // 選択中のセルの列Indexを取得
    int i = this.dgv.CurrentCell.ColumnIndex;

    // Index が 0・1・4 の列ならペーストする
    switch (i)
    {
        case 0:
        case 1:
        case 4:
            // クリップボードの文字列を取得
            string s = Clipboard.GetText();
            // 選択セルに反映
            this.dgv.CurrentCell.Value = s;
            break;
        default:
            break;
    }
}


これでとりあえずOKです。

しかし、今後は複数セルを選択していたら一括で入力したい欲にかられます。
これを実装すればなお快適に!

そのためには、選択中のセルのインデックスを全て取得して for で回してあげる必要があります。

if (e.Control && e.KeyCode == Keys.V)
{
    選択されているセルごとに判定
    foreach (DataGridViewCell c in dgv.SelectedCells)
    {
        int iR = c.RowIndex;
        int iC = c.ColumnIndex;

        // Index が 0・1・4 の列ならペーストする
        switch (iC)
        {
            case 0:
            case 1:
            case 4:
                // クリップボードの文字列を取得
                string s = Clipboard.GetText();
                // 選択セルに反映
                this.dgv.Rows[iR].Cells[iC].Value = s;
                break;
            default:
                break;
        }
    }
}

 

これでうまくいきました!