仅显示搜索到的treenode

时间:2011-08-26 15:22:28

标签: c# .net winforms

我在windowsform应用程序中执行treeview时执行搜索节点我需要隐藏所有剩余节点,我只需要显示搜索到的节点及其父节点。似乎

祖父母   Parent1      child1      的child2      child3。   parent2      child4      child5 如果搜索到的节点是子3 ,我需要将输出显示为..

祖父母    Parent1      child3 所有的姨妈都要隐藏。

1 个答案:

答案 0 :(得分:0)

不幸的是(据我所知)如果您使用的是WinForms TreeView控件,那么隐藏节点并不像设置IsVisible属性那么简单(由于该属性是只读的)。

隐藏节点的唯一方法是从节点集合中删除它们。

这意味着再次显示它们需要您在树层次结构中跟踪它们的位置才能恢复它们。

以下代码似乎可以满足您的需求:

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?