.NET Winforms中如何对TreeView的Level为0的根节点进行排序?
实现方案
核心思路
默认TreeView自带的Sort()方法会递归对所有层级节点排序,不符合需求,所以我们需要单独提取所有根节点排序后再重新赋值给TreeView.Nodes集合,子节点会跟随父节点自动保留原有顺序。
具体实现步骤
- 第一步:先关闭TreeView的UI重绘,避免排序过程中闪烁
treeView1.BeginUpdate();
- 第二步:提取所有根节点,转成列表后按你需要的规则排序(以下示例按节点Text升序,可自行修改排序逻辑)
// 提取所有根节点到临时列表 var rootNodes = treeView1.Nodes.Cast<TreeNode>().ToList(); // 按节点Text升序排序,可自定义排序规则,比如按Tag中存储的业务字段排序 rootNodes.Sort((a, b) => string.Compare(a.Text, b.Text, StringComparison.Ordinal));
- 第三步:清空原有根节点集合,把排序后的根节点重新添加回去
treeView1.Nodes.Clear(); treeView1.Nodes.AddRange(rootNodes.ToArray());
- 第四步:恢复UI重绘
treeView1.EndUpdate();
扩展封装(可选)
如果需要频繁调用根节点排序,可以封装成扩展方法,使用更灵活:
public static class TreeViewExtensions { public static void SortRootNodes(this TreeView treeView, Comparison<TreeNode> comparison = null) { if (treeView == null) throw new ArgumentNullException(nameof(treeView)); treeView.BeginUpdate(); try { var rootNodes = treeView.Nodes.Cast<TreeNode>().ToList(); // 未传入自定义排序规则时,默认按节点Text排序 comparison ??= (a, b) => string.Compare(a.Text, b.Text, StringComparison.CurrentCulture); rootNodes.Sort(comparison); treeView.Nodes.Clear(); treeView.Nodes.AddRange(rootNodes.ToArray()); } finally { treeView.EndUpdate(); } } } // 调用示例1:默认按Text排序 treeView1.SortRootNodes(); // 调用示例2:自定义按Tag存储的数值排序 treeView1.SortRootNodes((a, b) => ((int)a.Tag).CompareTo((int)b.Tag));
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

