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

时间:2014-09-16 20:17:54

标签: c# .net multithreading search treeview

我有Winforms申请和TreeView。 我的TreeView如果有充满节点(不是很多,最多约200个),我希望在每次文本更改后实现“正在进行”搜索,类似于Windows 7& 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在每种类型之后我遇到的类型之间卡住(很短的一段时间)所以我的问题是有没有办法改善这个没有这个小延迟变得更快?

1 个答案:

答案 0 :(得分:1)

您正在启动一个调用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();