注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
DataGridViewでユーザーがセルの値を編集する時、セルにはテキストボックスが表示されます(DataGridViewTextBoxColumnの場合)。現在表示されている(ホストされている)テキストボックスのオブジェクトを取得するには、DataGridViewオブジェクトのEditingControlプロパティを使用します。
テキストボックスが表示された時は、EditingControlShowingイベントが発生します。このEditingControlShowingイベントハンドラに渡されるDataGridViewEditingControlShowingEventArgsオブジェクトのControlプロパティでも表示されたテキストボックスを取得できます。
以下の例では、Column1列のセルだけテキストボックスのImeModeプロパティを変更しています。
'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
//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のセルの編集で使用されることもあります。このようなコントロールも上記と同じ方法で取得することができます。
ただし、編集にコントロールを使っているように見せかけているだけで、実際には使われていない場合も多々あります。例えば、DataGridViewCheckBoxColumnで表示されるチェックボックス、DataGridViewButtonColumnで表示されるボタン、DataGridViewLinkColumnで表示されるLinkLabelは、実際にこれらのコントロールが使用されているわけではありません。つまりこの方法で取得できるコントロールは、カスタムセルを除けば、DataGridViewTextBoxColumn列のDataGridViewTextBoxEditingControlオブジェクトと、DataGridViewComboBoxColumn列のDataGridViewComboBoxEditingControlオブジェクトだけということになります。