C# 按类型和字母顺序对树视图节点排序A->;Z

C# 按类型和字母顺序对树视图节点排序A->;Z,c#,winforms,sorting,treeview,custom-sort,C#,Winforms,Sorting,Treeview,Custom Sort,我正在开发一个使用树视图的应用程序。树状视图有三种类型的节点: 根节点:无法排序的节点,其标记包含字符串 “根”来识别它们 文件夹:那些可以排序,其思想是总是在顶部的其他节点之前,并按升序A->Z排序。这些有标签“文件夹” 其他:其思想是,这些文件夹位于文件夹之前,并且也按升序A->Z排序 以下是此树视图的外观: 其思想是对根节点(声音、音频数据)内的所有子节点进行排序,并始终将文件夹放在节点之前 我一直在尝试使用此代码,但不起作用: // Create a node sorter tha

我正在开发一个使用树视图的应用程序。树状视图有三种类型的节点:

  • 根节点:无法排序的节点,其标记包含字符串 “根”来识别它们
  • 文件夹:那些可以排序,其思想是总是在顶部的其他节点之前,并按升序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多个节点


谢谢

逻辑可以简化为按Taģ排序,然后按文本排序。因此,如果标签不同,则需要比较的是标签。如果标签相同,则比较文本

假设标记类型按以下顺序排列:

public enum TagType
{
    Root,
    Folder,
    Other
}
那么,以下逻辑应该起作用:

// Create a node sorter that implements the IComparer interface.
public class NodeSorter : IComparer
{
    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        if (tx.Tag != ty.Tag)
            return tx.Tag.CompareTo(ty.Tag);

        return string.Compare(tx.Text, ty.Text, true);
    }  
}

逻辑可以简化为按Taģ排序,然后按文本排序。因此,如果标签不同,则需要比较的是标签。如果标签相同,则比较文本

假设标记类型按以下顺序排列:

public enum TagType
{
    Root,
    Folder,
    Other
}
那么,以下逻辑应该起作用:

// Create a node sorter that implements the IComparer interface.
public class NodeSorter : IComparer
{
    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        if (tx.Tag != ty.Tag)
            return tx.Tag.CompareTo(ty.Tag);

        return string.Compare(tx.Text, ty.Text, true);
    }  
}

根节点没有父节点,它们的属性返回
0
,因此您不需要使用它们的
标记来识别它们。您只需识别分拣机中的
文件夹
节点即可进行排序,并将其置于其他节点之上。最后把剩下的分类

公共类节点排序器:IComparer
{
公共整数比较(对象x、对象y)
{
var nx=x为三烯醚;
var ny=y,表示三烯化物;
//保持根节点的顺序。。。
如果(nx.Level==0 | | ny.Level==0)返回1;
//如果x是文件夹。。。
if(nx.Tag是字符串sx&&sx==“文件夹”)
{
//y是文件夹。。。
if(ny.Tag是字符串sy&&sy==“文件夹”)
//然后,对它们进行排序。。。
返回string.Compare(nx.Text,ny.Text,true);
//否则,x在y之前。。。
返回-1;
}
//如果y是文件夹。。。
else if(ny.Tag是字符串sy&&sy==“文件夹”)
//然后,x跟在y后面。。。
返回1;
//对其他节点排序。。。
返回string.Compare(nx.Text,ny.Text,true);
}
}

根节点没有父节点,它们的属性返回
0
,因此您不需要使用它们的
标记
属性来识别它们。您只需识别分拣机中的
文件夹
节点即可进行排序,并将其置于其他节点之上。最后把剩下的分类

公共类节点排序器:IComparer
{
公共整数比较(对象x、对象y)
{
var nx=x为三烯醚;
var ny=y,表示三烯化物;
//保持根节点的顺序。。。
如果(nx.Level==0 | | ny.Level==0)返回1;
//如果x是文件夹。。。
if(nx.Tag是字符串sx&&sx==“文件夹”)
{
//y是文件夹。。。
if(ny.Tag是字符串sy&&sy==“文件夹”)
//然后,对它们进行排序。。。
返回string.Compare(nx.Text,ny.Text,true);
//否则,x在y之前。。。
返回-1;
}
//如果y是文件夹。。。
else if(ny.Tag是字符串sy&&sy==“文件夹”)
//然后,x跟在y后面。。。
返回1;
//对其他节点排序。。。
返回string.Compare(nx.Text,ny.Text,true);
}
}
当您说“根节点无法排序”时,您是指将根节点作为父节点的子节点吗?您的屏幕截图是否包含任何“根”节点?是的,我指的是像“音频数据”和“声音”这样的节点。当您说“根节点无法排序”时,您是指具有根节点作为父节点的子节点吗?您的屏幕截图是否包含任何“根”节点?是的,我指的是“音频数据”和“声音”等节点。