DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データグリッドビューのWrapModeプロパティとオートコンプリート。

環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 4]
分類:[.NET]

【解決したい問題】

いつもお世話になっています。現在、私用ソフトのデータグリッドビュー
にオートコンプリート機能を追加しようとしています。『DataGridViewに
表示されるテキストボックスのオートコンプリート機能を有効にする』
(http://dobon.net/vb/dotnet/datagridview/autocomplete.html)
を参考に試行錯誤しているのですが、オートコンプリート機能が有効にな
りません。

【解決するために何をしたか】

色々と試行錯誤してるうち、列のWrapModeプロパティにTrueを設定した場
合に限りオートコンプリート機能が有効にならない事が判りました。

【追加事項】

WrapModeをTrueにしつつ、オートコンプリート機能を有効にするために、
何か解決策はありますでしょうか。

Public Class Form1

    Private autoCompleteSource As New AutoCompleteStringCollection()
    Private DataGridView1 As New DataGridView

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        Me.Controls.Add(DataGridView1)
        DataGridView1.Location = Me.ClientRectangle.Location
        DataGridView1.Size = Me.ClientRectangle.Size
        DataGridView1.Anchor = AnchorStyles.Left + AnchorStyles.Right + AnchorStyles.Top + AnchorStyles.Bottom

        DataGridView1.Columns.Add("Column0", "カラム0")
        DataGridView1.Columns.Add("Column1", "カラム1")
        DataGridView1.Columns.Add("Column2", "カラム2")

        For i As Short = 0 To DataGridView1.ColumnCount - 1

            DataGridView1.Columns(i).DefaultCellStyle.WrapMode = DataGridViewTriState.True ' WrapModeプロパティにTrueを設定するとオートコンプリート機能が使えない。

        Next i

        AddHandler DataGridView1.EditingControlShowing, AddressOf DataGridView1_EditingControlShowing
        AddHandler DataGridView1.CellValueChanged, AddressOf DataGridView1_CellValueChanged

    End Sub

    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)

        If DataGridView1.CurrentCell.OwningColumn.Name = "Column1" Then
            CType(e.Control, TextBox).AutoCompleteMode = AutoCompleteMode.SuggestAppend
            CType(e.Control, TextBox).AutoCompleteSource = Windows.Forms.AutoCompleteSource.CustomSource
            CType(e.Control, TextBox).AutoCompleteCustomSource = autoCompleteSource
        Else
            CType(e.Control, TextBox).AutoCompleteMode = AutoCompleteMode.None
        End If
     
    End Sub

    Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)

        If DataGridView1.Columns(e.ColumnIndex).Name = "Column1" Then
            If Not String.IsNullOrEmpty(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) AndAlso _
               Not Me.autoCompleteSource.Contains(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) Then
                autoCompleteSource.Add(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
            End If
        End If

    End Sub

End Class
> WrapModeをTrueにしつつ、オートコンプリート機能を有効にするために、
> 何か解決策はありますでしょうか。

TextBoxのオートコンプリートは、複数行TextBoxで使用することができません。
少なくとも標準のオートコンプリートを使う限り、WrapModeと併用することはできませんね。
■No31867に返信(Hongliangさんの記事)

>TextBoxのオートコンプリートは、複数行TextBoxで使用することがで
>きません。少なくとも標準のオートコンプリートを使う限り、WrapMode
>と併用することはできませんね。
やはりそうですか。残念です。

標準のオートコンプリートですと、先行する行に「山口県」と「山形県」
がある場合、「山」と入力した時点で「山口県」と「山形県」の中から
選ぶ事が可能になりますが、Excelのオートコンプリート機能です
と、「山口」と入力して初めてセル内に「山口県」と表示され「県」部
分が選択状態になります。こういう、Excelタイプのオートコンプ
リート機能は標準では提供されていないのでしょうか(現在、KeyPress
イベントで拾ってやろうと作業中なんですが)。
解決済みBOXにチェックを忘れておりました。
ご迷惑おかけしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板