如何对treeView的子节点进行排序

时间:2018-06-19 07:07:25

标签: c# winforms sorting treeview custom-compare

我想按字母顺序对给定的TreeView子节点进行排序。

假设我的树视图是这样的:

  • firstNode1

    • secondNode1
    • thirdNode1
    • thirdNode2
    • thirdNode3 ...
  • firstNode2

    • secondNode1
    • thirdNode1
    • thirdNode2
    • thirdNode3 ...

我想对每个firstNode的secondNodes中的节点进行排序。

我该怎么办? - 我对Custom Comparer有所了解,但在我的情况下无法理解如何使用它。

1 个答案:

答案 0 :(得分:2)

对于普通的字母排序,只需调用内置排序:

treeView1.Sort();

你很好。

但有时这还不够好。然后,您需要编写自定义排序器。这很简单;它需要提供int<==>的结果,即返回-10或{{ 1}}分别。内置的比较器通常会在稍微按摩数据之后做。

以下是自定义排序器的示例。这是一个实现1接口的简单类,它只有一个方法..

在调用常规字符串IComparer方法之前,它为我的自定义比较准备了两个节点文本。

准备插入大量零以将尾随数字填充到恒定长度。

这只是一个例子,但会进行排序,例如设计器中的默认名称以数字/时间顺序排列。

Compare

通过分配它然后调用sort:

来调用它
public class NodeSorter : System.Collections.IComparer
{
    public NodeSorter() { }

    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        string s1 = tx.Text;
        while (s1.Length > 0 && Char.IsDigit(s1.Last())) s1 = s1.TrimEnd(s1.Last());
        s1 = s1 + tx.Text.Substring(s1.Length).PadLeft(12, '0');

        string s2 = tx.Text;
        while (s2.Length > 0 && Char.IsDigit(s2.Last())) s2 = s2.TrimEnd(s2.Last());
        s2 = s2 + ty.Text.Substring(s2.Length).PadLeft(12, '0');

        return string.Compare(s1, s2);
    }
}

结果:

enter image description here enter image description here enter image description here

这是MSDN TreeNodeSorter example的略微修改版本。除了改变的逻辑,请注意:

  • 该示例为,并且未正确限定treeView1.TreeViewNodeSorter = new NodeSorter(); treeView1.Sort(); 接口。随着泛型的出现,我们通常会有一个IComparer子句,这将隐藏非泛型using System.Collections.Generic;接口,从而导致编译错误,抱怨关于缺少的类型参数。

添加资格认证可以解决..:

IComparer