Vb.net 仅在datagridview中为单列自动完成文本

Vb.net 仅在datagridview中为单列自动完成文本,vb.net,datagridview,Vb.net,Datagridview,我试图在datagridview中提供自动完成的文本。但是,我在“所有”列中得到了自动完成的文本,在单击第三列(带有组合框)后,应用程序开始显示编辑其他单元格时的错误 我希望自动完成第一列中的文本框,即仅“名称”。我无法管理代码,因此自动完成不会显示在第二列中,即“年龄”,并且在单击组合框列后也不会出现错误。 代码如下 Public Class Form1 Private Sub appData(ByVal data As AutoCompleteStringCollection, B

我试图在datagridview中提供自动完成的文本。但是,我在“所有”列中得到了自动完成的文本,在单击第三列(带有组合框)后,应用程序开始显示编辑其他单元格时的错误

我希望自动完成第一列中的文本框,即仅“名称”。我无法管理代码,因此自动完成不会显示在第二列中,即“年龄”,并且在单击组合框列后也不会出现错误。

代码如下

Public Class Form1

    Private Sub appData(ByVal data As AutoCompleteStringCollection, ByVal c As String)
        data.Add("Ravi")
        data.Add("Raj")
        data.Add("Raja")
        data.Add("r " & c)
    End Sub

    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        Try
            MsgBox(e.Control.ToString)
            Dim header As String = DataGridView1.Columns(0).HeaderText
            If TypeOf e.Control Is TextBox AndAlso header.Equals("Name") AndAlso DataGridView1.CurrentCell.ColumnIndex = 0 Then
                If DataGridView1.CurrentCell.ColumnIndex = 0 Then
                    Dim text As TextBox = TryCast(e.Control, TextBox)
                    If text IsNot Nothing Then
                        text.AutoCompleteMode = AutoCompleteMode.Suggest
                        text.AutoCompleteSource = AutoCompleteSource.CustomSource

                        Dim data As AutoCompleteStringCollection = New AutoCompleteStringCollection()
                        appData(data, DataGridView1.CurrentCellAddress.ToString)
                        text.AutoCompleteCustomSource = data
                    End If
                Else
                    Dim text As TextBox = TryCast(e.Control, TextBox)
                    text.AutoCompleteCustomSource = Nothing
                    text.AutoCompleteSource = AutoCompleteSource.None
                    text.AutoCompleteMode = AutoCompleteMode.None
                End If
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DataGridView1.Columns.Add("ColName", "Name")
        DataGridView1.Columns.Add("ColAge", "Age")
        Dim ComCol As New DataGridViewComboBoxColumn
        ComCol.Items.Add(1)
        ComCol.Items.Add(2)
        ComCol.HeaderText = "Combobox Col"
        DataGridView1.Columns.Add(ComCol)
    End Sub
End Class
仅使用:

If header.Equals("Name") Then
而不是:

   If TypeOf e.Control Is TextBox AndAlso header.Equals("Name") AndAlso 
     DataGridView1.CurrentCell.ColumnIndex = 0 Then

我认为问题在于DataGridView1_EditingControlShowing的启动频率比您意识到的要高

也许您应该在表单加载事件上执行自动完成工作?这样,它只需要运行一次

我所说的“自动完成工作”,就是这一部分:

                text.AutoCompleteMode = AutoCompleteMode.Suggest
                text.AutoCompleteSource = AutoCompleteSource.CustomSource

                Dim data As AutoCompleteStringCollection = New AutoCompleteStringCollection()
                appData(data, DataGridView1.CurrentCellAddress.ToString)
                text.AutoCompleteCustomSource = data

按照以下步骤在Else条款中进行测试:

If header.Equals("Name") Then

                If DataGridView1.CurrentCell.ColumnIndex = 0 Then
                    Dim text As TextBox = TryCast(e.Control, TextBox)
                    If text IsNot Nothing Then
                        text.AutoCompleteMode = AutoCompleteMode.Suggest
                        text.AutoCompleteSource = AutoCompleteSource.CustomSource

                        Dim data As AutoCompleteStringCollection = New AutoCompleteStringCollection()
                        appData(data, DataGridView1.CurrentCellAddress.ToString)
                        text.AutoCompleteCustomSource = data
                    End If
                ElseIf TypeOf e.Control Is TextBox Then
                    Dim text As TextBox = TryCast(e.Control, TextBox)
                    text.AutoCompleteCustomSource = Nothing
                    text.AutoCompleteSource = AutoCompleteSource.None
                    text.AutoCompleteMode = AutoCompleteMode.None
                End If
            End If

   Private Sub DataGridView1_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        Try

        Catch ex As Exception

        End Try
    End Sub

感谢您的回复,仅使用您提到的单个条件问题已部分解决,在单列中自动完成显示,但在单击最后一列单元格后,在单击其他单元格时仍出现错误。好的,请查看我的第二个答案,请不要忘记投票并标记答案此方法无法解决单击第三列(组合框)后出现的错误。您可以通过处理偶数“DataGridView1_DataError”来解决此问题,例如:查看我的答案,我已为您编辑了答案。请跳一下解决问题的方法E>标记答案