注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
DataGridViewに表示されるテキストボックスのオートコンプリート機能を有効にする方法は、「DataGridViewに表示されているテキストボックスを取得する」を理解できれば、簡単です。このようにして取得したテキストボックスのAutoCompleteModeプロパティを変更するだけです。
なおこの方法については、「DataGridView: Auto Complete Textbox」などでも紹介されていますが、ここで紹介する例では、DataGridViewのセルの値を自動的にオートコンプリートリストに追加しています。
以下に示す例では、文字列型の"Column1"列に表示されるテキストボックスにオートコンプリート機能をつけています。
Dim autoCompleteSource As New AutoCompleteStringCollection() 'EditingControlShowingイベントハンドラ Private Sub DataGridView1_EditingControlShowing( _ ByVal sender As Object, _ ByVal e As DataGridViewEditingControlShowingEventArgs) _ Handles DataGridView1.EditingControlShowing Dim dgv As DataGridView = CType(sender, DataGridView) If TypeOf e.Control Is TextBox Then '編集のために表示されているテキストボックスを取得 Dim tb As TextBox = CType(e.Control, TextBox) '該当する列か調べる If dgv.CurrentCell.OwningColumn.Name = "Column1" Then 'オートコンプリートを有効にする tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend tb.AutoCompleteSource = _ Windows.Forms.AutoCompleteSource.CustomSource tb.AutoCompleteCustomSource = Me.autoCompleteSource Else 'オートコンプリートを無効にする tb.AutoCompleteMode = AutoCompleteMode.None End If End If End Sub 'DataSourceChangedイベントハンドラ Private Sub DataGridView1_DataSourceChanged( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles DataGridView1.DataSourceChanged Dim dgv As DataGridView = CType(sender, DataGridView) 'オートコンプリートのリストを初期化 Me.autoCompleteSource.Clear() 'DataGridView内のデータをリストに追加 Dim r As DataGridViewRow For Each r In dgv.Rows 'セルの値を取得 Dim val As String = r.Cells("Column1").Value If Not String.IsNullOrEmpty(val) AndAlso _ Not Me.autoCompleteSource.Contains(val) Then 'オートコンプリートのリストに追加 autoCompleteSource.Add(val) End If Next r End Sub 'CellValueChangedイベントハンドラ Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles DataGridView1.CellValueChanged Dim dgv As DataGridView = CType(sender, DataGridView) '該当する列か調べる If dgv.Columns(e.ColumnIndex).Name = "Column1" Then 'セルの値を取得 Dim val As String = dgv(e.ColumnIndex, e.RowIndex).Value If Not String.IsNullOrEmpty(val) AndAlso _ Not Me.autoCompleteSource.Contains(val) Then 'オートコンプリートのリストに追加 autoCompleteSource.Add(val) End If End If End Sub
AutoCompleteStringCollection autoCompleteSource = new AutoCompleteStringCollection(); //EditingControlShowingイベントハンドラ private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { DataGridView dgv = (DataGridView)sender; if (e.Control is TextBox) { //編集のために表示されているテキストボックスを取得 TextBox tb = (TextBox)e.Control; //該当する列か調べる if (dgv.CurrentCell.OwningColumn.Name == "Column1") { //オートコンプリートを有効にする tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend; tb.AutoCompleteSource = AutoCompleteSource.CustomSource; tb.AutoCompleteCustomSource = this.autoCompleteSource; } else { //オートコンプリートを無効にする tb.AutoCompleteMode = AutoCompleteMode.None; } } } //DataSourceChangedイベントハンドラ private void DataGridView1_DataSourceChanged(object sender, EventArgs e) { DataGridView dgv = (DataGridView)sender; //オートコンプリートのリストを初期化 this.autoCompleteSource.Clear(); //DataGridView内のデータをリストに追加 foreach (DataGridViewRow r in dgv.Rows) { //セルの値を取得 string val = r.Cells["Column1"].Value as string; if (!string.IsNullOrEmpty(val) && !this.autoCompleteSource.Contains(val)) { //オートコンプリートのリストに追加 autoCompleteSource.Add(val); } } } //CellValueChangedイベントハンドラ private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; //該当する列か調べる if (dgv.Columns[e.ColumnIndex].Name == "Column1") { //セルの値を取得 string val = dgv[e.ColumnIndex, e.RowIndex].Value as string; if (!string.IsNullOrEmpty(val) && !this.autoCompleteSource.Contains(val)) { //オートコンプリートのリストに追加 autoCompleteSource.Add(val); } } }
この例では、DataSourceChangedイベントハンドラでDataGridViewのDataSourceが変更された時にColumn1列のセルの値をすべてオートコンプリートのリストに追加し、さらに、CellValueChangedイベントハンドラでセルの値が変更された時にその値をリストに追加しています。