Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实施;“正在进行”;在每次文本更改后进行搜索_C#_.net_Multithreading_Search_Treeview - Fatal编程技术网

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

C# 实施;“正在进行”;在每次文本更改后进行搜索,c#,.net,multithreading,search,treeview,C#,.net,Multithreading,Search,Treeview,我有Winforms应用程序和TreeView。 MyTreeView如果节点太多(不多,最多200个),我希望在每次文本更改后实现“持续”搜索,类似于Windows 7&8搜索,即每次文本更改后都有新的搜索。 因此,我注册了我的TextBoxSearch\u TextChanging event,每次文本更改我都会打开新的Thread,搜索用户键入的字符串,如果我的节点。text从后一个/字符串开始此节点变为可见: RadTreeView treeView; private void rad

我有
Winforms
应用程序和
TreeView
。 My
TreeView
如果节点太多(不多,最多200个),我希望在每次文本更改后实现“持续”搜索,类似于Windows 7&8搜索,即每次文本更改后都有新的搜索。 因此,我注册了我的
TextBoxSearch\u TextChanging event
,每次文本更改我都会打开新的
Thread
,搜索用户键入的字符串,如果我的
节点。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造成的。我建议在循环之前调用
TreeView
,然后在完成后,如下所示:

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();