Отображение только искомого триода - PullRequest
0 голосов
/ 26 августа 2011

У меня есть древовидная структура в приложении windowsform, когда выполняется поиск узла. Мне нужно скрыть все оставшиеся узлы, и мне нужно показать только искомый узел и его родительский элемент.parent2 child4 child5, если искомым узлом является child 3 мне нужно показать результат в виде ..

grandParent Parent1 child3 все остальные должны быть Скрыть.

1 Ответ

0 голосов
/ 26 августа 2011

К сожалению (насколько я знаю), если вы используете элемент управления 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; }
    }
}

Надеюсь, это вам поможет.

Я заметил, что вы новый пользователь, Если этот или любые другие вопросы, которые вы задаете насайт предоставляет ответы, которые вы ищете, не забывайте принимать ответы.

См. следующие сведения для получения дополнительной информации: Как работает принятие ответа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...