6

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

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

  • 第一个节点1

    • 第二节点1
    • 第三节点1
    • 第三节点2
    • 第三节点3 ...
  • 第一个节点2

    • 第二节点1
    • 第三节点1
    • 第三节点2
    • 第三节点3 ...

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

我该怎么做?- 我对自定义比较器有疑问,但不明白如何在我的情况下使用它。

4

1 回答 1

10

对于正常的字母排序,只需调用内置排序:

treeView1.Sort();

你很好。

但有时这还不够好。然后你需要编写一个自定义排序器。这真的很简单;它需要提供的只是, orint的结果,即分别返回or 。通常,内置比较器会在稍微按摩数据后进行。<==>-101

这是自定义排序器的示例。这是一个实现接口的简单类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);
    }
}

您通过分配它然后调用排序来调用它:

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

结果:

在此处输入图像描述在此处输入图像描述在此处输入图像描述

这是MSDN TreeNodeSorter 示例的略微修改版本。除了更改的逻辑之外,请注意:

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

添加资格可以解决这个问题..:

public class NodeSorter : System.Collections.IComparer
于 2018-06-19T08:26:42.750 回答