【问题标题】:Re-Sorting treeview Nodes[0] only after being populated仅在填充后重新排序树视图节点 [0]
【发布时间】:2011-11-20 08:29:08
【问题描述】:

我有以下树:

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

每只动物都有一个 ID 号存储在 Tag 字段中,它们的名字在节点的 Name 字段中。我想按下一个按钮,上面写着“按 ID 排序”,让上面的“斑马”变成“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();
    }

关于我做错了什么有什么想法吗?我已经在网上搜索了两个星期,并且被所有的树视图文章所淹没。然而,没有一个是这么具体的。 感谢伙计们/姑娘们的任何建议。

【问题讨论】:

    标签: c# winforms sorting treeview


    【解决方案1】:

    使用 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);
                }
            }
        }
    

    【讨论】:

    • 我取出了 convert.ToInt32(我实际上使用了 alpha-nums),它可以很好地转换为动物 ID。但是,如果我在交换名称后使用它,它不会再次排序。不过没关系。我可以在那个上使用基本的 treeview.Sort() 方法,它工作正常。所以两个按钮而不是一个。对我正在做的事情来说没什么大不了的。我之前确实尝试过这个解决方案,但最后我没有使用 else 索引比较。我是新手!!哈哈谢谢汉斯,这看起来会奏效。
    【解决方案2】:
    //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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2020-09-12
      • 2018-10-07
      • 2023-03-12
      • 1970-01-01
      • 2014-11-01
      相关资源
      最近更新 更多