如何对TreeView控件的子节点进行排序

6
我想对给定的TreeView子节点按字母顺序进行排序。
假设我的树形视图如下所示:
  • firstNode1

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

    • secondNode1
    • thirdNode1
    • thirdNode2
    • thirdNode3 ...
我希望对每个firstNode下的secondNode节点进行排序。
我该怎么做? - 我已经了解了自定义比较器,但不知道如何在我的情况下使用它。

1
我们还需要一个 [mcve],展示你目前的努力。 - dymanoid
1个回答

14

如果要进行普通字母排序,只需调用内置的sort函数:

treeView1.Sort();

而有时这还不够好,这时你需要编写一个自定义排序器。这很简单,它只需要为<==>的结果提供一个返回-101int即可。通常,在对数据进行一些处理后,内置的比较器就能胜任。

这是一个自定义排序器的示例。它是一个简单的类,实现了IComparer接口,该接口只有一个方法。


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

这个准备过程会插入许多零来填充尾随数字,使其长度恒定。

虽然这只是一个示例,但它可以按数值/时间顺序排序例如设计师的默认名称。


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

你可以通过赋值并调用sort方法来调用它:

treeView1.TreeViewNodeSorter = new NodeSorter();
treeView1.Sort();

结果:

enter image description hereenter image description hereenter image description here

这是一个稍微修改过的MSDN TreeNodeSorter 示例。除了更改后的逻辑外,注意以下几点:

  • 该示例较旧,并且未正确限定IComparer接口。随着泛型的出现,我们通常会有一个using System.Collections.Generic;子句,并且这将隐藏非泛型的IComparer接口,导致编译器错误,抱怨缺少类型参数。

添加限定符可以解决这个问题..:

public class NodeSorter : System.Collections.IComparer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接