如何对treeView的子节点进行排序
how to sort the child nodes of treeView
我想按字母顺序对给定的 TreeView 子节点进行排序。
假设我的树视图是这样的:
第一个节点1
- secondNode1
- 第三个节点 1
- 第三个节点 2
- 第三个节点 3
...
第一个节点2
- secondNode1
- 第三个节点 1
- 第三个节点 2
- 第三个节点 3
...
我想对每个 firstNode 的 secondNodes 中的节点进行排序。
我该怎么做? - 我对 Custom Comparer 很不满,但无法理解如何在我的案例中使用它。
对于正常字母顺序排序只需调用内置排序:
treeView1.Sort();
你很好
但有时这还不够好。然后你需要写一个自定义排序器。这真的很简单;它只需要为 <
、==
或 >
的结果提供一个 int
,即 return -1
、0
或 1
分别。通常,内置比较器会在稍微修改数据后执行操作。
这是自定义排序器的示例。这是一个简单的 class 实现 IComparer
接口,它只有一个方法..
它在调用常规字符串 Compare
方法之前为我的自定义比较准备两个节点文本。
准备插入大量零来填充尾随数字到固定长度。
这只是一个例子,但会排序,例如设计师的默认名称 numerically/chronologically.
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
接口。随着 generics 的出现,我们通常有一个 using System.Collections.Generic;
子句,这将 hide 非泛型 IComparer
接口,导致编译器错误,抱怨缺少类型参数。
添加限定条件可以解决这个问题..:[=28=]
public class NodeSorter : System.Collections.IComparer
我想按字母顺序对给定的 TreeView 子节点进行排序。
假设我的树视图是这样的:
第一个节点1
- secondNode1
- 第三个节点 1
- 第三个节点 2
- 第三个节点 3 ...
第一个节点2
- secondNode1
- 第三个节点 1
- 第三个节点 2
- 第三个节点 3 ...
我想对每个 firstNode 的 secondNodes 中的节点进行排序。
我该怎么做? - 我对 Custom Comparer 很不满,但无法理解如何在我的案例中使用它。
对于正常字母顺序排序只需调用内置排序:
treeView1.Sort();
你很好
但有时这还不够好。然后你需要写一个自定义排序器。这真的很简单;它只需要为 <
、==
或 >
的结果提供一个 int
,即 return -1
、0
或 1
分别。通常,内置比较器会在稍微修改数据后执行操作。
这是自定义排序器的示例。这是一个简单的 class 实现 IComparer
接口,它只有一个方法..
它在调用常规字符串 Compare
方法之前为我的自定义比较准备两个节点文本。
准备插入大量零来填充尾随数字到固定长度。
这只是一个例子,但会排序,例如设计师的默认名称 numerically/chronologically.
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
接口。随着 generics 的出现,我们通常有一个using System.Collections.Generic;
子句,这将 hide 非泛型IComparer
接口,导致编译器错误,抱怨缺少类型参数。
添加限定条件可以解决这个问题..:[=28=]
public class NodeSorter : System.Collections.IComparer