实施“;正在进行的“;每次文本更改后进行搜索

本文关键字:搜索 正在进行 实施 文本 | 更新日期: 2023-09-27 18:22:10

我有Winforms应用程序和TreeView。我的TreeView如果充满了节点(不那么多,最多~200个),我想在每个文本更改后实现"正在进行的"搜索,类似于Windows7&8搜索每个文本更改后都有新的搜索。因此,我注册到我的TextBoxSearch_TextChanging event,每次文本更改,我都会打开新的Thread,并搜索用户键入的字符串,如果我的node.Text以后一个字符串开头,则该节点将可见:

RadTreeView treeView;
private void radTextBoxSearch_TextChanging(object sender, TextChangingEventArgs e)
{
    string stringToSearch = radTextBoxSearch.Text.ToLower();
    ThreadStart ts = delegate
    {
        this.Invoke((MethodInvoker)delegate
        {
             foreach (RadTreeNode node in treeView.Nodes)
             {
                 string nodeText = node.Text.ToLower();
                 if (!nodeText.StartsWith(stringToSearch))
                 {
                     node.Visible = false;
                 }
                 else
                     node.Visible = true;
             }                   
        });
    };
    Thread thread = new Thread(ts);
    thread.IsBackground = true;
    thread.Start();
}

所以这很好,除了我在每种类型后遇到的类型之间有一点延迟''UI卡住(很短的一段时间),所以我的问题是,有没有办法在没有这一点延迟的情况下改进这一点,使其变得更快?

实施“;正在进行的“;每次文本更改后进行搜索

您正在启动一个调用Invoke的线程,这将导致代码在UI线程上执行。因此,创建单独的线程没有任何好处。

延迟可能是由于在设置了每个节点的可见性之后更新了树视图。我建议在循环之前在TreeView上调用SuspendLayout,完成后再调用ResumeLayout,如下所示:

string stringToSearch = radTextBoxSearch.Text.ToLower();
treeView.SuspendLayout();
foreach (RadTreeNode node in treeView.Nodes)
{
    string nodeText = node.Text.ToLower();
    node.Visible = nodeText.StartsWith(stringToSearch);
}
treeView.ResumeLayout();