1,则 TextBox1.AutoCompleteSource=AutoCompleteSource.None 可设置为DataTable=sqlt.ReadDB(“从地址簿中选择*名,其中名为“”&TextBox1.Text&“%”) 如果可诱惑。行。计数0,则 对于每个r,在tetrable.Rows中作为DataRow TextBox1.AutoCompleteCustomSource.Add(r.Item(“DisplayName”).ToString) 下一个 TextBox1.AutoCompleteSource=AutoCompleteSource.CustomSource 如果结束 如果结束 端接头,c#,.net,vb.net,exception,access-violation,C#,.net,Vb.net,Exception,Access Violation" /> 1,则 TextBox1.AutoCompleteSource=AutoCompleteSource.None 可设置为DataTable=sqlt.ReadDB(“从地址簿中选择*名,其中名为“”&TextBox1.Text&“%”) 如果可诱惑。行。计数0,则 对于每个r,在tetrable.Rows中作为DataRow TextBox1.AutoCompleteCustomSource.Add(r.Item(“DisplayName”).ToString) 下一个 TextBox1.AutoCompleteSource=AutoCompleteSource.CustomSource 如果结束 如果结束 端接头,c#,.net,vb.net,exception,access-violation,C#,.net,Vb.net,Exception,Access Violation" />

C# 直到我发现您必须将autocompletesource更改为none,直到您添加了所需的所有项目,然后在完成后将其返回到customsource。下面是我使用的代码。请原谅SQL语句,因为我们构建了一个包装器DLL文件来简化SQL请求 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If TextBox1.Text.Length > 1 Then TextBox1.AutoCompleteSource = AutoCompleteSource.None Dim TempTable As DataTable = sqlt.ReadDB("select * from AddressBook where FirstName like '" & TextBox1.Text & "%'") If TempTable.Rows.Count <> 0 Then For Each r As DataRow In TempTable.Rows TextBox1.AutoCompleteCustomSource.Add(r.Item("DisplayName").ToString) Next TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource End If End If End Sub Private Sub TextBox1\u TextChanged(ByVal sender作为对象,ByVal e作为System.EventArgs)处理TextBox1.TextChanged 如果TextBox1.Text.Length>1,则 TextBox1.AutoCompleteSource=AutoCompleteSource.None 可设置为DataTable=sqlt.ReadDB(“从地址簿中选择*名,其中名为“”&TextBox1.Text&“%”) 如果可诱惑。行。计数0,则 对于每个r,在tetrable.Rows中作为DataRow TextBox1.AutoCompleteCustomSource.Add(r.Item(“DisplayName”).ToString) 下一个 TextBox1.AutoCompleteSource=AutoCompleteSource.CustomSource 如果结束 如果结束 端接头

C# 直到我发现您必须将autocompletesource更改为none,直到您添加了所需的所有项目,然后在完成后将其返回到customsource。下面是我使用的代码。请原谅SQL语句,因为我们构建了一个包装器DLL文件来简化SQL请求 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If TextBox1.Text.Length > 1 Then TextBox1.AutoCompleteSource = AutoCompleteSource.None Dim TempTable As DataTable = sqlt.ReadDB("select * from AddressBook where FirstName like '" & TextBox1.Text & "%'") If TempTable.Rows.Count <> 0 Then For Each r As DataRow In TempTable.Rows TextBox1.AutoCompleteCustomSource.Add(r.Item("DisplayName").ToString) Next TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource End If End If End Sub Private Sub TextBox1\u TextChanged(ByVal sender作为对象,ByVal e作为System.EventArgs)处理TextBox1.TextChanged 如果TextBox1.Text.Length>1,则 TextBox1.AutoCompleteSource=AutoCompleteSource.None 可设置为DataTable=sqlt.ReadDB(“从地址簿中选择*名,其中名为“”&TextBox1.Text&“%”) 如果可诱惑。行。计数0,则 对于每个r,在tetrable.Rows中作为DataRow TextBox1.AutoCompleteCustomSource.Add(r.Item(“DisplayName”).ToString) 下一个 TextBox1.AutoCompleteSource=AutoCompleteSource.CustomSource 如果结束 如果结束 端接头,c#,.net,vb.net,exception,access-violation,C#,.net,Vb.net,Exception,Access Violation,6岁时——这个问题没有真正的答案,或者至少没有被接受的答案;因此,我将在如何克服这个问题上加上我的两分钱 是什么导致了这个错误? 如果在AutoCompleteTestringCollection()数据仍附加到对象(即文本框)时动态更改该数据,则会发生错误,因为Visual Studio将无法从内存中处理该数据,因此在重新分配时,该数据会落入堆中并引发错误 解决办法 虽然您可以实现一个系统来捕获这些错误,并最终对最终用户隐藏它们;潜在的错误仍然存在,因此这远远不是最佳实践 显而易见的答案是放弃

6岁时——这个问题没有真正的答案,或者至少没有被接受的答案;因此,我将在如何克服这个问题上加上我的两分钱

是什么导致了这个错误? 如果在AutoCompleteTestringCollection()数据仍附加到对象(即文本框)时动态更改该数据,则会发生错误,因为Visual Studio将无法从内存中处理该数据,因此在重新分配时,该数据会落入堆中并引发错误

解决办法 虽然您可以实现一个系统来捕获这些错误,并最终对最终用户隐藏它们;潜在的错误仍然存在,因此这远远不是最佳实践

显而易见的答案是放弃在飞行中改变震源;尽管这并不总是可能的——特别是当应用程序依赖于源代码更改来按预期工作时

当您需要动态更改源时;在更改源代码之前,应放置以下代码

textbox1.AutoCompleteSource = AutoCompleteSource.None;
使用
AutoCompleteStringCollection()
重新填充源代码后,应将文本框恢复为自定义源代码

textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
通过这样做;您将防止错误发生


编辑:有时,对于某些用户,您可能会发现在重新分配新值之前需要清空自动完成的字符串集合-这可以通过将其分配给
null
然后重新填充来实现

为什么不从数据库中填充一次列表,包括每个项目?这可行吗?“制作一个WPF控件并在WINFORMs项目中使用它”。@minitech好吧,我想这是一种方法,但每次客户想查看客户时,都会加载10000行……我不知道我对此有何感想……我可能不得不向这里的一些专业人士询问加载这么多数据的问题。有可能客户甚至不想编辑该框,只是复制街道名称或其他内容。作为一种临时措施,它可能会起作用,但有没有办法按照我们最初想要的方式来做呢?@安德里斯:好吧,试试看,看看它有多快。。。我还认为可以将它绑定到数据库,让它自己做,但我现在无法尝试,这很有效。必须添加一个检查项是否有一个额外的项,以避免更新前项为空时出现问题,之后就没有问题了。我刚刚使用WinForms组合框,并听取了Competable_tech的建议,我的表单现在运行良好。即使这可能是正确的答案,请在您的代码中添加注释,以便更好地被接受。我认为您的意思是6岁,而不是6个月大,十年后仍然是一个问题!>我发誓我试过了,但没用。。不过,我每次都在设置AutoCompleteMode和AutoCompleteCustomSource,这可能会带来额外的悲伤。尽管如此,这仍然有助于理解错误发生的原因。哦,天哪……这个怎么样。。为项目启用“调试非托管代码”设置是没有问题的,但是如果没有它,“自动完成”不会第一次弹出,并且仍然有可能发生冲突!怎么回事?:<我假设程序的发布版本也会有同样的问题,所以im sol和jwf。
On general
Dim textme as string

On textchange
If textme =text1.text then exit sub
Textme=text1.text
Text1.autocompletecustomesource.clear
Text1.autocompletecustomesource.add ...
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    If TextBox1.Text.Length > 1 Then
        TextBox1.AutoCompleteSource = AutoCompleteSource.None
        Dim TempTable As DataTable = sqlt.ReadDB("select * from AddressBook where FirstName like '" & TextBox1.Text & "%'")
        If TempTable.Rows.Count <> 0 Then
            For Each r As DataRow In TempTable.Rows
                TextBox1.AutoCompleteCustomSource.Add(r.Item("DisplayName").ToString)
            Next
            TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
        End If
    End If
End Sub
textbox1.AutoCompleteSource = AutoCompleteSource.None;
textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;