AutoCompleteStringCollection with TextChanged Event
本文关键字:Event TextChanged with AutoCompleteStringCollection | 更新日期: 2023-09-27 17:53:41
我目前使用一个文本框来过滤一些条目。我在文本框TextChanged事件上更新了显示,这样用户就不用按回车键或按按钮开始过滤了。我想使用AutoCompleteStringCollection来记住输入文本框的条目;但是,如果在触发TextChanged事件时保存文本框中的每个字符串,则它将存储每个筛选项的所有子字符串。
例如,如果我输入字符串"test",它会显示:"t"
"te"
"tes"
"test"
作为推荐字符串。我只是想把最后一个字符串添加到AutoCompleteStringCollection。
我想过我可以实现两个独立的方法。
1)我可以创建一个Task
, 等待"x"量的时间在最后一个TextChanged事件之后,它将字符串添加到AutoCompleteStringCollection。如果我这样做,我就必须在每次触发textChanged事件时使用cancellationToken来取消Task。这有点复杂,因为我使用的是。net 4.0。
2)我也可以通过AutoCompleteStringCollection搜索每次添加字符串和删除所有子字符串(从单词的开头开始)。如果用户键入了更具体的筛选器,但仍然希望存储较短的筛选器,那么这可能会适得其反。
有更好的方法去做这件事吗?你会推荐哪种方法?
在尝试动态填充AutoCompleteStringCollection时需要注意两件事。首先是微软对这个问题的解决方案:
在关键事件期间不要动态修改AutoComplete候选列表。(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,会有一个违规异常。建议追加或追加。
虽然这不是一个完整的答案,但我希望它能帮助任何设法找到这个问题的人。