2011-08-26 89 views
0

我有樹狀的windowsform申請節點進行,我需要隱藏所有剩餘的節點進行搜索時,我需要只顯示搜索到的節點與其父。像只顯示搜索樹節點

祖父母 Parent1 child1 child2 child3。 parent2 child4 child5 如果搜索節點孩子3我需要顯示出把儘可能..

祖父母 Parent1 child3 所有auother都被隱藏。

+0

如果您正在使用「的ObservableCollection 」和WPF數據綁定這是很容易做到這一點。你確定你使用winforms嗎? – Artfunkel

+0

你好我正在使用winforms –

回答

0

不幸的是(據我所知),如果你使用的是WinForms TreeView控件,那麼隱藏節點並不像設置IsVisible屬性那樣簡單(由於屬性是隻讀的)。

隱藏節點的唯一方法是將它們從Nodes集合中刪除。

這意味着再次顯示它們將要求您跟蹤它們在樹層次結構中的位置以便能夠恢復它們。

下面的代碼似乎做你需要什麼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using ClassLibrary; 
using System.Xml; 
using System.Diagnostics; 
using System.IO; 
using System.Xml.Linq; 

namespace WindowsFormsApplication 
{ 
    public partial class HideRestoreNodesForm : Form 
    { 
     private List<RemovedTreeNode> _removedNodes = new List<RemovedTreeNode>(); 

     public HideRestoreNodesForm() 
     { 
      InitializeComponent(); 

      //AddNodesToTree(); 
     } 

     private void searchButton_Click(object sender, EventArgs e) 
     { 
      TreeNode[] foundNodes = treeView1.Nodes.Find("NameOfNodeToFind", true); 
      if(foundNodes.Length > 0) 
      { 
       TreeNode foundNode = foundNodes[0]; 
       HideNodes(treeView1.Nodes, foundNode); 
      } 
     } 

     private void HideNodes(TreeNodeCollection nodes, TreeNode visibleNode) 
     { 
      List<TreeNode> nodesToRemove = new List<TreeNode>(); 
      foreach (TreeNode node in nodes) 
      { 
       if (!AreNodesRelated(node, visibleNode)) 
       { 
        _removedNodes.Add(new RemovedTreeNode() { RemovedNode = node, ParentNode = node.Parent, RemovedNodeIndex = node.Index }); 
        nodesToRemove.Add(node); 
       } 
       else 
       { 
        HideNodes(node.Nodes, visibleNode); 
       } 
      } 

      foreach (TreeNode node in nodesToRemove) 
       node.Remove(); 
     } 

     private bool AreNodesRelated(TreeNode firstNode, TreeNode secondNode) 
     { 
      if (!IsNodeAncestor(firstNode, secondNode) && !IsNodeAncestor(secondNode, firstNode) && firstNode != secondNode) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 

     private bool IsNodeAncestor(TreeNode nodeToCheck, TreeNode descendantNode) 
     { 
      TreeNode parentNode = descendantNode.Parent; 
      while (parentNode != null) 
      { 
       if (parentNode == nodeToCheck) 
       { 
        return true; 
       } 
       else 
       { 
        parentNode = parentNode.Parent; 
       } 
      } 

      return false; 
     } 

     private void restoreNodes_Click(object sender, EventArgs e) 
     { 
      RestoreNodes(); 
     } 

     private void RestoreNodes() 
     { 
      _removedNodes.Reverse(); 
      foreach (RemovedTreeNode removedNode in _removedNodes) 
      { 
       if (removedNode.ParentNode == null) 
        treeView1.Nodes.Add(removedNode.RemovedNode); 
       else 
        removedNode.ParentNode.Nodes.Insert(removedNode.RemovedNodeIndex ,removedNode.RemovedNode); 
      } 

      _removedNodes.Clear(); 
     } 
    } 

    public class RemovedTreeNode 
    { 
     public TreeNode RemovedNode { get; set; } 
     public int RemovedNodeIndex { get; set; } 
     public TreeNode ParentNode { get; set; } 
    } 
} 

希望這有助於你。

我注意到你是一個新用戶,如果你在網站上提出的這個或任何其他問題提供你正在尋找的答案,請記住接受答案。

更多信息請參閱以下內容:How does accepting an answer work?