2012-07-17 130 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; 
}