首页 > 解决方案 > 按类型和字母顺序 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 个节点。

谢谢!

标签: c#winformssortingtreeviewcustom-sort

解决方案


根节点没有父节点并且它们的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);
    }
}

推荐阅读