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