2012-07-17 117 views
8

此功能只找到在树状第一节点,包含SEARCHTEXT。树视图搜索

private TreeNode SearchNode(string SearchText,TreeNode StartNode) 
    { 
     TreeNode node=null; 
     while (StartNode!= null) 
     { 
      if (StartNode.Text.ToLower().Contains(SearchText.ToLower())) 
      { 
       node = StartNode; 
       break; 
      }; 
      if (StartNode.Nodes.Count != 0) 
      { 
       node=SearchNode(SearchText, StartNode.Nodes[0]);//Recursive Search 
       if (node != null) 
       { 
        break; 
       }; 
      }; 
      StartNode = StartNode.NextNode; 
     }; 
     return node; 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     string SearchText = this.textBox1.Text; 
     if (SearchText == "") 
     { 
      return; 
     }; 
     TreeNode SelectedNode = SearchNode(SearchText, treeView1.Nodes[0]); 
     if (SelectedNode != null) 
     { 
      this.treeView1.SelectedNode = SelectedNode; 
      this.treeView1.SelectedNode.Expand(); 
      this.treeView1.Select(); 
     }; 
    } 

我应该如何改变它,这样的功能将能够找到不仅是第一个节点,但所有这些,每次当我点击按钮1,它会寻找下一个节点,直到结束,然后它从一开始就开始。所以我不应该从TreeView1.Nodes [0],而是从TreeView1.SelectedNode搜索...

+0

上的文字是这样的WinForms和ASP.Net?这个问题有两个部分,真的 - 找到节点,然后显示它们。我怀疑这就是作者创建函数的原因 - 它只返回一个节点,以便将树扩展到单个节点。 – dash 2012-07-17 21:04:37

+0

这是WinForms。我并不需要在同一时间显示所有节点,我需要选择旋转 – 2012-07-17 21:16:40

回答

13

像下面要细要添加到您的窗体的代码。

private List<TreeNode> CurrentNodeMatches = new List<TreeNode>(); 

    private int LastNodeIndex = 0; 

    private string LastSearchText; 


    private void button1_Click(object sender, EventArgs e) 
    { 


     string searchText = this.textBox1.Text; 
     if (String.IsNullOrEmpty(searchText)) 
     { 
      return; 
     }; 


     if (LastSearchText != searchText) 
     { 
      //It's a new Search 
      CurrentNodeMatches.Clear(); 
      LastSearchText = searchText; 
      LastNodeIndex = 0; 
      SearchNodes(searchText, treeView1.Nodes[0]); 
     } 

     if (LastNodeIndex >= 0 && CurrentNodeMatches.Count > 0 && LastNodeIndex < CurrentNodeMatches.Count) 
     { 
      TreeNode selectedNode = CurrentNodeMatches[LastNodeIndex]; 
      LastNodeIndex++; 
      this.treeView1.SelectedNode = selectedNode; 
      this.treeView1.SelectedNode.Expand(); 
      this.treeView1.Select(); 

     } 
    } 

    private void SearchNodes(string SearchText, TreeNode StartNode) 
    { 
     TreeNode node = null; 
     while (StartNode != null) 
     { 
      if (StartNode.Text.ToLower().Contains(SearchText.ToLower())) 
      { 
       CurrentNodeMatches.Add(StartNode); 
      }; 
      if (StartNode.Nodes.Count != 0) 
      { 
       SearchNodes(SearchText, StartNode.Nodes[0]);//Recursive Search 
      }; 
      StartNode = StartNode.NextNode; 
     }; 

    } 

有两个部分,

  1. 收集所有的节点进入通过List<TreeNode>一个List<TreeNode>

  2. 页如果搜索没有改变。如果搜索已更改,请清除列表并重置索引。

我在.NET 4下运行Windows窗体测试这一点 - 它通过网页中包含搜索文本,1 1直到它到达最后一个节点一个TreeView的每个节点。使用这种解决方案搜索

+0

谢谢这么多破折号 – 2012-07-20 10:59:15

+0

好的解决方案:)。 – 2014-05-09 07:21:35

2

您需要创建一个节点集合(如List)并将每个找到的节点添加到该列表中,并返回该节点而不是单个节点。此外,你必须删除所有break语句

+0

节点,我不需要在同一时间显示所有节点,我需要一次只选择一个节点,但是当我第二次点击button1,我需要第二个结果被选中 – 2012-07-17 21:20:12

+0

嗯,在原帖中没有提及(“所有人,每次点击button1”)。在这种情况下,只需将SearchNode保持不变,并将返回值存储在某处并将其作为StartNode参数传递。 (它默认为treeView1.Nodes [0])... – 2012-07-17 21:29:59

+0

Acctually我不需要存储返回值,我可以只写treeView1.SelectedNode(“SelectedNode”是SearchNode函数的最后结果)。但是,如果结果是派生节点,那不起作用,我不知道为什么 – 2012-07-17 21:36:00

-1

一载树节点

int currentSearch = 0; 
int loop = 0; 
int found = 0; 

private bool FilterTreeNode(TreeNodeCollection nodes, string keyword) 
{ 
    bool result = false; 
    for (int i = 0; i < nodes.Count; i++) 
    { 
     if(result) 
      break; 
     loop++; 
     if (currentSearch < loop) 
     { 
      currentSearch++; 
      if (nodes[i].Text.Contains(keyword)) 
      { 
       found++; 
       _treeView.SelectedNode = nodes[i]; 
       _treeView.SelectedNode.Expand(); 
       _treeView.SelectedNode.EnsureVisible(); 
       OnFindResult(string.Format("Current result: {0} on total {1} nodes. FilePath: {2}", 
            found, _treeView.GetNodeCount(true), nodes[i].Name)); 
       return true; 
      } 
     } 
     result = FilterTreeNode(nodes[i].Nodes, keyword); 
    } 

    return result; 
}