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

DataGridViewに表示されるテキストボックスのオートコンプリート機能を有効にする

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

DataGridViewに表示されるテキストボックスのオートコンプリート機能を有効にする方法は、「DataGridViewに表示されているテキストボックスを取得する」を理解できれば、簡単です。このようにして取得したテキストボックスのAutoCompleteModeプロパティを変更するだけです。

なおこの方法については、「DataGridView: Auto Complete Textbox」などでも紹介されていますが、ここで紹介する例では、DataGridViewのセルの値を自動的にオートコンプリートリストに追加しています。

以下に示す例では、文字列型の"Column1"列に表示されるテキストボックスにオートコンプリート機能をつけています。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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イベントハンドラでセルの値が変更された時にその値をリストに追加しています。

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

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