使用TextChanged事件

时间:2015-06-04 14:55:25

标签: c# winforms .net-4.0

我目前正在使用文本框过滤某些条目。我在文本框TextChanged事件上更新了显示,因此用户不会按Enter键或按下按钮开始过滤。我想使用AutoCompleteStringCollection来记住在文本框中输入的条目;但是,如果我在触发TextChanged事件时从文本框中保存每个字符串,那么它将存储每个过滤器术语的所有子字符串。

例如,如果我输入字符串" test"它会显示: "t" "te" "tes" "test" 作为推荐字符串。我只想将最后一个字符串添加到AutoCompleteStringCollection。

我已经考虑过两种可以实现的方法。

1)我可以创建一个Task 等待" x"在将字符串添加到AutoCompleteStringCollection之前的最后一次TextChanged事件之后的时间量。如果我这样做,我将不得不使用cancellationToken取消每次textChanged事件触发时的任务。这稍微复杂一点,因为我使用的是.NET 4.0。

2)每次添加字符串并且删除所有子字符串(从单词的开头开始),我也可以通过AutoCompleteStringCollection 搜索。如果用户键入更具体的过滤器,但仍希望存储较短的过滤器,则可能会适得其反。

还有更好的方法吗?你会推荐哪种方法?

1 个答案:

答案 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。

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

相关问题