TextBox AutoComplete无法正常工作

我正在尝试使用数组forms的自定义数据源实现文本框自动完成,该数组显示有关单个字符输入的建议。 但是当我运行程序时,自动完成仅在第二个字符输入后开始。 当我调试时,我看到AutoCompleteNameCollection中有数据,但在第二个字符输入之前它没有显示在建议中。

这段代码我写的是textchange事件。

arr = LoadName(empid_txt.Text.Trim()); //arr is string array namesCollection.AddRange(arr); this.empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; this.empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; this.empid_txt.AutoCompleteCustomSource = namesCollection; 

在LoadEvent中,我使用空数组初始化了AutoCompleteNameCollection。

 namesCollection.AddRange(arr);// here arr is empty empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; empid_txt.AutoCompleteCustomSource = namesCollection; 

但它直到第二个字符输入才起作用。 但是,如果不使用数组,我使用空字符串初始化AutoCompleteNameCollection,如:namesCollection.Add(“”); 它适用于单个字符输入,但有时会产生AccessViolationException:尝试读取或写入受保护的内存。 那么有什么办法可以解决这个问题吗?

在加载时,您可以使用数据的子集填充TextBox (甚至可以缓存以供将来/共享使用)。 如果你有一个“最常见”的柜台,你可以使用它。 作为限制条件,您甚至可以添加一个虚拟项目(如果您使用空字符串获得的是访问冲突)。 然后,在TextChange事件上从数据库中读取所需的数据。

我只有一个问题:在用户开始输入之前,您不想填充源代码? 如果存在网络流量问题,那么您需要移动大量数据。 如果您移动大量数据,那么您的用户将不得不等待他们开始输入内容。 可以接受吗? 另一方面,如果他们不等待太多,也许数据流不是那么大,你可以将这个逻辑放在表单构造函数的BackgroundWorker中(或者离那个时间不远)。

我可以在事件处理程序中设置AutoCompleteSource时复制访问冲突,似乎自动完成例程可能在替换和销毁时访问AutoCompleteSource。

为了防止这种情况,您可以锁定代码。

 lock(this) { arr = LoadName(empid_txt.Text.Trim()); //arr is string array namesCollection.AddRange(arr); this.empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; this.empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; this.empid_txt.AutoCompleteCustomSource = namesCollection; } 

这阻止了访问冲突。

AutoComplete建议在按下第二个char后是正常的,因为首先,您已将arr (这是您的自定义数据源)初始化为空数组。 您已在TextChanged事件中填充了您的arr ,这就是为什么AutoComplete在第二个char上工作的原因,因为您的数据源是根据您的第一个char( 这绝对是您不想要的 )进行过滤的。

这是一个建议:

  • 在应用程序的FormLoad事件中,填写arr并提供所有可能的建议( 我认为建议的来源是来自数据库的吗? )。 这将允许文本框在您的第一个字符上建议。

  • 当您输入第一个char时,在TextChanged事件上,根据输入的主要字符重新加载您的arr数据源。

希望能帮助到你。

如果初始化文本框时’arr’为空,则无需进行比较。 在开始键入之前,必须将AutoCompleteCustomSource初始化为有效的数组。 当用户已键入字符时,您正在textchange事件中初始化。

您需要在更改代码之前填充namesCollection – 在Initialize中。

在窗体上加载调用文本框自动完成方法。

  public void autocompleteData() { //SuggestStrings will have the logic to return array of strings either from cache/db var CurrentuserId = CloudKaseWSClient.GetUserDetail(tokenUsr, tokenPasswd, Username); List l = new List(); var SearchResults = ("Select Database Query").ToList(); foreach (var i in SearchResults) { l.Add(i.name); } string[] arr = l.ToArray(); AutoCompleteStringCollection collection = new AutoCompleteStringCollection(); collection.AddRange(arr); txtSearchUser.AutoCompleteMode = AutoCompleteMode.SuggestAppend; txtSearchUser.AutoCompleteSource = AutoCompleteSource.CustomSource; txtSearchUser.AutoCompleteCustomSource = collection; } 

或者您想为AutoComplete Textbox设置静态数据,而不是必须在AutocompleteMode的Textbox属性的Design Design视图中设置SuggestAppend,AutocompleteSource设置CustomSource并在AutocompleteCustomSource中添加静态值。

我希望这个解决方案对你有帮助..快乐编码。:)