Вопрос по treeview, c# – Как динамически заполнить дерево (C #)

6

У меня есть таблица с 3 столбцами, ID, имя и ParentID. Столбец ID содержит рабочий номер, который также служит первичным ключом. ID также будет узломName свойства. Столбец имени содержит строку, которая будет трехэлементной.Text атрибут, в то время как ParentID представляет собой столбец, содержащий родительский идентификатор узла.

Вот так выглядит моя таблица:

ID     Name   ParentID
======================
1      A      0
2      A1     1
3      B      0
4      C      0
5      A2     1
6      B1     3

Эта таблица показывает, что узел A является родительским узлом для узлов A1 и A2. ParentID равен "0" означает, что родительский узел является корневым узлом (жестко закодированным). Например, узлы A, B и C являются дочерними узлами корневых узлов.

Я сортирую строки по ParentID до заполнения дерева. Я заполняю представление дерева, используя эти два метода (узел TreeNode здесь является дочерним узлом, который заполняется в дереве):

    private void SearchParent(TreeView tree, String parentID, TreeNode node)
    {
        // Post: call TraverseParent method to search parent

        TreeNodeCollection collection = tree.Nodes;

        // Search parent recursively
        foreach (TreeNode n in collection)
        {
            TraverseParent(n, parentID, node);
        }
    }

    private void TraverseParent(TreeNode potentialParent, String parentID, TreeNode node)
    {
        // Post: search for parent. When parent is found add child to parent

        // am i the parent that you're looking for?
        if (parentID.CompareTo(potentialParent.Name) == 0)
        {
            // found me! i'm your parent!

            // add child to parent
            potentialParent.Nodes.Add(node);

            // update that the parent for child has been found
            parentFound = true;
        }
        else
        {
            // i'm not your parent

            // continue to look for parent recursively
            foreach (TreeNode n in potentialParent.Nodes)
            {
                TraverseParent(n, parentID, node);
            }
        }
    }

Все хорошо, пока я не перетаскиваю узлы, делая узел A дочерним по отношению к узлу C и фиксируя изменения в базе данных.

Теперь моя таблица базы данных выглядит так:

ID     Name   ParentID
======================
1      A      4
2      A1     1
3      B      0
4      C      0
5      A2     1
6      B1     3

В следующий раз, когда я запускаю приложение, оно не может заполнить узлы A1 и A2 в дереве, потому что оно не может найти их родителей. Это потому, что когда я сортирую строки на основе ParentID до заполнения дерева, строки сортируются следующим образом:

ID     Name   ParentID
======================
3      B      0
4      C      0
2      A1     1
5      A2     1
6      B1     3
1      A      4

Таким образом, мое приложение будет пытаться заполнить узлы A1 и A2 в дереве еще до того, как будет создан узел A. Поэтому приложение не может найти родителя для узлов A1 и A2.

Следовательно, может кто-нибудь сказать мне, как исправить эту ошибку, или есть лучший способ динамического заполнения дерева?

Благодарю.

Спасибо за ссылку! ixora
Посмотреть здесь -stackoverflow.com/questions/361661/… Angshuman Agarwal

Ваш Ответ

1   ответ
15

Обещанный пример:

public partial class Form1 : Form
    {
        private class ItemInfo
        {
            public int ID;
            public int ParentID;
            public string Name;
        }

        public Form1()
        {
            InitializeComponent();
            FillTreeView();
        }

        private void FillTreeView()
        {
            var items = new List<ItemInfo>()
            {
                new ItemInfo(){ID = 1, ParentID = 4, Name = "A"},
                new ItemInfo(){ID = 2, ParentID = 1, Name = "A1"},
                new ItemInfo(){ID = 3, ParentID = 0, Name = "B"},
                new ItemInfo(){ID = 4, ParentID = 0, Name = "C"},
                new ItemInfo(){ID = 5, ParentID = 1, Name = "A2"},
                new ItemInfo(){ID = 6, ParentID = 3, Name = "B1"},
            };

            FillNode(items, null);
        }

        private void FillNode(List<ItemInfo> items, TreeNode node)
        {
            var parentID = node != null
                ? (int)node.Tag
                : 0;

            var nodesCollection = node != null
                ? node.Nodes
                : treeView1.Nodes;

            foreach (var item in items.Where(i => i.ParentID == parentID))
            {
                var newNode = nodesCollection.Add(item.Name, item.Name);
                newNode.Tag = item.ID;

                FillNode(items, newNode);
            }
        }
    }
Error: User Rate Limit Exceeded

Похожие вопросы