【问题标题】:how to sort the child nodes of treeView如何对treeView的子节点进行排序
【发布时间】:2018-11-28 01:36:19
【问题描述】:

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

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

  • 第一个节点1

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

    • secondNode1
    • 第三个节点1
    • 第三个节点2
    • 第三节点3 ...

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

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

【问题讨论】:

标签: c# winforms sorting treeview custom-compare


【解决方案1】:

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

treeView1.Sort();

你很好。

但有时这还不够好。然后你需要编写一个自定义排序器。这真的很简单;它只需要为<==> 的结果提供int,即分别返回-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 example 的略微修改版本。除了更改的逻辑,请注意:

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

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

public class NodeSorter : System.Collections.IComparer

【讨论】:

  • 你能解释一下 treeview.sort() 有时不如自定义排序好,正如你在回答中提到的那样。
  • 这一切都取决于你的规则。看看这个例子:第二张图片显示了在“11”之后如何简单地按字母排序“4”。可以吗?其他示例可能是“沃尔特迪斯尼”之前的“亚当沃尔特”之类的名字。或按州排序城市,然后按名称(“达拉斯,德克萨斯”在“洛杉矶,加利福尼亚”之前)..
  • 但我很困惑这里究竟是如何进行排序的,我们是否首先获取第一个节点并将其与该级别的所有节点进行比较,然后如果它根据字符串按字母顺序较早出现,则将其替换。比较结果。我只是想问一下排序是如何完成的,请不要介意我是c#的新手
  • 没问题,。当您调用 tv.Sort() 时,系统始终会执行实际的排序。我只是提供了一个自定义的比较规则。系统排序是如何实现的还不得而知,但当然会做很多比较。有许多排序算法,有些更简单,有些更复杂。我们不知道使用的是哪一个。但是如果我们好奇的话,我们可以记录输入到比较函数中的节点以了解更多信息。但我们不必担心,框架会负责实际的排序:-)
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 2017-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2019-07-14
相关资源
最近更新 更多