DataGridView:セルの”文字入力不可”と”ctrl+C ”を両立

※参考URL
http://dobon.net/vb/dotnet/datagridview/textboxevent.html
http://support.microsoft.com/kb/839201/ja
http://www.atmarkit.co.jp/fdotnet/dotnettips/538dgvedit/dgvedit.html


入力はさせたく無いけど、選択コピーは許可したいんだよなぁというわけで、少し調べてみた。

サンプルソース

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    //セルが選択された瞬間、文字選択にする
    //ReadOnlyはFalseにしておく
    dgv.BeginEdit(true);
}   

//セル編集用コントロールが表示されたとき
private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    //編集のために表示されているコントロールを取得
    DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;

    //イベントハンドラを削除
    tb.KeyPress -= new KeyPressEventHandler(dataGridViewTextBox_KeyPress);
    tb.KeyDown -= new KeyEventHandler(dataGridViewTextBox_KeyDown);

    //イベントハンドラを追加
    tb.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress);
    tb.KeyDown += new KeyEventHandler(dataGridViewTextBox_KeyDown);
}


private void dataGridViewTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = true;
}


private void dataGridViewTextBox_KeyDown(object sender, KeyEventArgs e)
{
     DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)sender;
     if (e.Control && e.KeyCode.ToString() == "C")
     {
         //クリップボードにコピー
         Clipboard.SetDataObject(tb.SelectedText.ToString());
     }
}

dobon.netさんは本当に偉大だ。