Повторная сортировка древовидных узлов [0] только после заполнения - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть следующее дерево:

Animals
 |
 |___Zebra
 |    |__Head
 |    |__Arms
 |    |__Legs
 |   
 |___Monkey
      |__Head
      |__Arms
      |__Legs

У каждого животного есть идентификационный номер, который хранится в поле «Тег», а его имя - в поле «Имя» узла. Я хочу нажать кнопку с надписью «Сортировать по идентификатору», чтобы приведенная выше «зебра» превратилась в «14» и т. Д. , а затем прибегнуть к численно. Однако я хочу, чтобы дети оставались в порядке головы, рук, ног. Когда я использую следующий код, он работает, но он также перераспределяет ноги головы рук в руки, голову, ноги. Я пробовал NodeSorter, но я не получил никаких других результатов. Я также очень плохо знаком с C #, поэтому мог бы неправильно его реализовать. :) Я также использую пользовательский узел с несколькими дополнительными полями для хранения данных и логических значений. Это то, на что ссылается «JacksNode» ниже.

Вот код:

public static void sortByAnimalID(TreeView tv)
    {
        tv.BeginUpdate();
        foreach (TreeNode treeNode in tv.Nodes[0].Nodes)
        {
            if (((JacksNode)treeNode).IsAnimal)
            {
                treeNode.Text = Convert.ToString(treeNode.Tag);
                treeNode.Name = Convert.ToString(treeNode.Tag);
            }
        }
        tv.Sort();
        tv.EndUpdate();
    }

Есть идеи, что я делаю не так? Я искал в Интернете две недели и был завален всеми статьями в виде дерева. Тем не менее, никто не был таким конкретным. Спасибо, ребята / девочки за любые предложения.

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Используйте свойство TreeNode.Level, чтобы выяснить, как сравнивать свойства узла.Как это:

    private void SortButton_Click(object sender, EventArgs e) {
        if (treeView1.TreeViewNodeSorter == null) {
            treeView1.TreeViewNodeSorter = new NodeSorter();
        }
    }
    private class NodeSorter : System.Collections.IComparer {
        public int Compare(object x, object y) {
            TreeNode node1 = (TreeNode)x;
            TreeNode node2 = (TreeNode)y;
            if (node1.Level == 1) {
                return Convert.ToInt32(node1.Tag).CompareTo(Convert.ToInt32(node2.Tag));
            }
            else {
                return node1.Index.CompareTo(node2.Index);
            }
        }
    }
0 голосов
/ 19 сентября 2011
//bubble sort
    public  void Sort_TV_ByTag(TreeNodeCollection treeNodeCollection)
    {

        int i, j;
        int n = treeNodeCollection.Count;

        for (i = 0; i < n; i++)
        {
            for (j = 1; j < (n - i); j++)
            {
                int firstValue = int.Parse(treeNodeCollection[j - 1].Tag.ToString());
                int secondValue = int.Parse(treeNodeCollection[j].Tag.ToString());

                //you can compare by Tag , Text , anything 
                if (firstValue > secondValue)
                {

                    //swap the nodes
                    TreeNode n1 = treeNodeCollection[j - 1];
                    TreeNode n2 = treeNodeCollection[j];
                    treeNodeCollection.Remove(n1);
                    treeNodeCollection.Remove(n2);
                    treeNodeCollection.Insert(j, n1);
                    treeNodeCollection.Insert(j - 1, n2);

                }

            }
        }

    }


    private void button1_Click(object sender, EventArgs e)
    {
        Sort_TV_ByTag(treeView1.Nodes[0].Nodes);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...