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 with TextChanged Event

在尝试动态填充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,会有一个违规异常。建议追加或追加。

虽然这不是一个完整的答案,但我希望它能帮助任何设法找到这个问题的人。