TextBox AutoComplete无法正常工作

时间:2012-02-28 17:37:40

标签: c# autocomplete textbox

我正在尝试使用数组形式的自定义数据源实现文本框自动完成,该数组显示有关单个字符输入的建议。但是当我运行程序时,自动完成仅在第二个字符输入后开始。当我调试时,我看到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:尝试读取或写入受保护的内存。 那么有什么方法可以解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

我可以在事件处理程序中设置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;
}

这阻止了访问冲突。

答案 1 :(得分:1)

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

这是一个建议:

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

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

希望它有所帮助。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

 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<string> l = new List<string>();
            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中添加静态值。

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