c# - 按类型和字母顺序 A->Z 对树视图节点进行排序
问题描述
我正在开发一个使用树视图的应用程序。树视图具有三种类型的节点:
- 根节点:那些不能排序的,它们的标签包含字符串“Root”来识别它们
- 文件夹:那些可以排序的,想法是总是在顶部的其他节点之前,并按 A->Z 升序排序。这些具有标签“文件夹”。
- 其他:想法是那些在文件夹之前,并且按 A->Z 升序排序
这是此树视图的外观:
这个想法是对根节点(声音、音频数据)内的所有子节点进行排序,并始终将文件夹放在节点之前。
我一直在尝试使用此代码但不起作用:
// Create a node sorter that implements the IComparer interface.
public class NodeSorter : IComparer
{
public int Compare(object x, object y)
{
int resultComparing;
TreeNode tx = x as TreeNode;
TreeNode ty = y as TreeNode;
if (tx.Tag.ToString().Equals("Root") || ty.Tag.ToString().Equals("Root"))
{
resultComparing = 2;
}
else if (tx.Tag.ToString().Equals("Folder") || ty.Tag.ToString().Equals("Folder"))
{
resultComparing = string.Compare(tx.Tag.ToString(), ty.Tag.ToString(), true);
}
else
{
resultComparing = string.Compare(tx.Text, ty.Text, true);
}
return resultComparing;
}
}
代码非常优化也会很有趣,因为这个树视图可以轻松包含超过 500 个节点。
谢谢!
解决方案
根节点没有父节点并且它们的Level
属性返回0
,因此您不需要使用它们的Tag
属性来识别它们。您只需要识别Folder
排序器中的节点即可进行排序并将它们保持在其他节点之上。然后最后对其余的进行排序。
public class NodeSorter : IComparer
{
public int Compare(object x, object y)
{
var nx = x as TreeNode;
var ny = y as TreeNode;
// Keep the order of the root nodes...
if (nx.Level == 0 || ny.Level == 0) return 1;
// If x is Folder...
if (nx.Tag is string sx && sx == "Folder")
{
// And y is Folder...
if (ny.Tag is string sy && sy == "Folder")
// Then, sort them...
return string.Compare(nx.Text, ny.Text, true);
// Otherwise, x precedes y...
return -1;
}
// If y is Folder...
else if (ny.Tag is string sy && sy == "Folder")
// Then, x follows y...
return 1;
// Sort the other nodes...
return string.Compare(nx.Text, ny.Text, true);
}
}
推荐阅读
- activeadmin - 您是否有自定义的活动管理索引页面构建器?
- html5-formvalidation - 如何控制数字必填字段的 HTML 5 验证?
- r - 当信息同时在属性节点和文本节点中时,将嵌套的 XML 文档转换为数据框
- django - 为覆盖保存的新添加字段运行迁移
- dart - 如何防止 RenderBox 绘制在其他小部件上?
- android - Android 架构组件和分段 RecyclerView
- c++ - 通过引用从地图中获取对象
- scala - Play framework 2.x (Scala) Navigation menu - 在每次请求时从 db 获取一些数据的最佳实践
- jquery - 使用 jQuery 解析 XML,从节点获取图像 url
- php - laravel:如何检查每个类别中的项目可用性?