DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridViewでセルの編集に使われているテキストボックスを取得する

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

DataGridViewでユーザーがセルの値を編集する時、セルにはテキストボックスが表示されます(DataGridViewTextBoxColumnの場合)。現在表示されている(ホストされている)テキストボックスのオブジェクトを取得するには、DataGridViewオブジェクトのEditingControlプロパティを使用します。

テキストボックスが表示された時は、EditingControlShowingイベントが発生します。このEditingControlShowingイベントハンドラに渡されるDataGridViewEditingControlShowingEventArgsオブジェクトのControlプロパティでも表示されたテキストボックスを取得できます。

以下の例では、Column1列のセルだけテキストボックスのImeModeプロパティを変更しています。

VB.NET
コードを隠すコードを選択
'EditingControlShowingイベントハンドラ
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
        ByVal e As DataGridViewEditingControlShowingEventArgs) _
        Handles DataGridView1.EditingControlShowing
    '表示されているコントロールがDataGridViewTextBoxEditingControlか調べる
    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
        Dim dgv As DataGridView = CType(sender, DataGridView)

        '編集のために表示されているコントロールを取得
        Dim tb As DataGridViewTextBoxEditingControl = _
            CType(e.Control, DataGridViewTextBoxEditingControl)
        '次のようにしてもよい
        'Dim tb As TextBox = CType(e.Control, TextBox)

        '列によってIMEのモードを変更する
        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then
            tb.ImeMode = Windows.Forms.ImeMode.Disable
        Else
            tb.ImeMode = dgv.ImeMode
        End If
    End If
End Sub
C#
コードを隠すコードを選択
//EditingControlShowingイベントハンドラ
private void DataGridView1_EditingControlShowing(object sender,
    DataGridViewEditingControlShowingEventArgs e)
{
    //表示されているコントロールがDataGridViewTextBoxEditingControlか調べる
    if (e.Control is DataGridViewTextBoxEditingControl)
    {
        DataGridView dgv = (DataGridView)sender;

        //編集のために表示されているコントロールを取得
        DataGridViewTextBoxEditingControl tb =
            (DataGridViewTextBoxEditingControl)e.Control;
        //次のようにしてもよい
        //TextBox tb = (TextBox)e.Control;

        //列によってIMEのモードを変更する
        if (dgv.CurrentCell.OwningColumn.Name == "Column1")
            tb.ImeMode = ImeMode.Disable;
        else
            tb.ImeMode = dgv.ImeMode;
    }
}

ただし、テキストボックスのForeColorやBackColorプロパティを変更して、テキストボックスの外観を変更することはできません。これらは、DataGridViewEditingControlShowingEventArgsのCellStyleプロパティを使って変更します。

なお、あるセルで表示されたテキストボックスは、同じDataGridView内の別のセルでも使用されることに注意してください。同じDataGridView内のDataGridViewTextBoxColumn列で使用されるテキストボックスは一つだけであり、これが別の列でも使いまわされます。よって上記のコードのように、ある列に表示されるテキストボックスのプロパティだけを変更したい場合は、別の列にテキストボックスが表示された時に元に戻す必要があります。

DataGridViewでセルの編集に使われているその他のコントロールを取得する

テキストボックス以外のコントロールがDataGridViewのセルの編集で使用されることもあります。このようなコントロールも上記と同じ方法で取得することができます。

ただし、編集にコントロールを使っているように見せかけているだけで、実際には使われていない場合も多々あります。例えば、DataGridViewCheckBoxColumnで表示されるチェックボックス、DataGridViewButtonColumnで表示されるボタン、DataGridViewLinkColumnで表示されるLinkLabelは、実際にこれらのコントロールが使用されているわけではありません。つまりこの方法で取得できるコントロールは、カスタムセルを除けば、DataGridViewTextBoxColumn列のDataGridViewTextBoxEditingControlオブジェクトと、DataGridViewComboBoxColumn列のDataGridViewComboBoxEditingControlオブジェクトだけということになります。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。