我正在开发一个使用树视图的应用程序。树视图有三种类型的节点:
- 根节点:这些节点无法排序,它们的标签包含字符串“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个以上的节点。
谢谢你!
2条答案
按热度按时间iyfamqjs1#
根节点没有父节点,它们的
Level
属性返回0
,所以你不需要使用它们的Tag
属性来识别它们,你只需要在排序器中识别出Folder
节点来排序,并将它们放在其他节点的前面,最后对剩下的节点进行排序。cygmwpex2#
逻辑可以简化为先按标签再按文本排序。因此,如果标签不同,则需要比较标签。如果标签相同,则比较文本。
假设标记类型按以下顺序排列:
那么下面的逻辑应该起作用: