我目前正在使用文本框过滤某些条目。我在文本框TextChanged事件上更新了显示,因此用户不会按Enter键或按下按钮开始过滤。我想使用AutoCompleteStringCollection来记住在文本框中输入的条目;但是,如果我在触发TextChanged事件时从文本框中保存每个字符串,那么它将存储每个过滤器术语的所有子字符串。
例如,如果我输入字符串" test"它会显示:
"t"
"te"
"tes"
"test"
作为推荐字符串。我只想将最后一个字符串添加到AutoCompleteStringCollection。
我已经考虑过两种可以实现的方法。
1)我可以创建一个Task
等待" x"在将字符串添加到AutoCompleteStringCollection之前的最后一次TextChanged事件之后的时间量。如果我这样做,我将不得不使用cancellationToken取消每次textChanged事件触发时的任务。这稍微复杂一点,因为我使用的是.NET 4.0。
2)每次添加字符串并且删除所有子字符串(从单词的开头开始),我也可以通过AutoCompleteStringCollection 搜索。如果用户键入更具体的过滤器,但仍希望存储较短的过滤器,则可能会适得其反。
还有更好的方法吗?你会推荐哪种方法?
答案 0 :(得分:1)
尝试动态填充AutoCompleteStringCollection时,需要注意两件事。首先是微软对此问题的解决方案:
请勿在关键事件期间动态修改自动完成候选列表。 (MSDN)
话虽如此,我能够想出一种动态添加元素到列表的方法。
我最终选择了Task实现的修改版本。我没有使用CancellationToken和TokenSource,而是使用了bool。我的代码最终看起来像这样:
private void AddSearchToDropDown ()
{
Task.Factory.StartNew (() =>
{
if (CanAdd && filterTxtBox.Text.Length > 2)
{
CanAdd = false;
Thread.Sleep (4000);
this.Invoke(new Action(() =>
{
filterTxtBox.AutoCompleteMode = AutoCompleteMode.None;
m_suggestedTests.Add (filterTxtBox.Text);
filterTxtBox.AutoCompleteMode = AutoCompleteMode.Suggest;
CanAdd = true;
}));
}
});
}
您还需要textChanged事件处理程序中的代码,只要他们开始在文本框中输入,就会将bool设置为false。这样,您就不会在第一个文本更改事件后4秒添加第一个条目。
要注意的第二件事是,如果我使用AutoCompleteMode.SuggestAppend或Append,则会出现Violation Exception。
虽然这不是一个完整的答案,但我希望它可以帮助任何设法找到这个问题的人。