C# WinForms TreeView:.NET 10的新特性CompareOptions.NumericOrdering
我对C#还挺陌生的,正在用WinForms在 .NET 10上开发一个应用。
我的应用有一个TreeView控件,用户可以在树的任意位置添加新节点。因为树有时会变得有点乱,所以在上下文菜单中,我设置了一个排序选项,它会调用 TreeView1.Sort();,把节点按字母顺序排序,如下所示:
Document1
Document10
Document11
Document2
这不是我想要的。我更希望它们按数字排序,就像Windows文件资源管理器一样,像这样:
Document1
Document2
Document10
Document11
从谷歌搜索中我知道实现起来可能会相当复杂,但我也了解到.NET 10现在包含 NumericOrdering。我原本以为只是简单地设定一个标志,但显然远非如此。我找不到任何关于它用法的示例,如果有人能指点我正确的方向,那就太好了。
解决方案
你需要一个实现了 IComparer 接口的排序器类:
public class TreeViewNodeSorter : System.Collections.IComparer
{
public int Compare(object? x, object? y) =>
string.Compare(((TreeNode)x!).Text, ((TreeNode)y!).Text,
CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
}
在窗体的构造函数中创建排序器,并将其分配给 TreeViewNodeSorter 属性:
public Form1()
{
InitializeComponent();
treeView1.TreeViewNodeSorter = new TreeViewNodeSorter();
// ...
}
在.NET10之前,这样的排序可以像这样实现:
public class TreeViewNodeSorter : System.Collections.IComparer
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
public int Compare(object? x, object? y) =>
StrCmpLogicalW(((TreeNode)x!).Text, ((TreeNode)y!).Text);
}
从谷歌搜索我知道这可能会变得相当复杂...
该算法可以用多种实现方式,因为在 '0'..'9' 之前还有字符 '!'..'/'。但最简单、最直观的实现可以用下面这段话来描述:要比较的文本被分成域:数字域和文本的其余部分,然后对这些域成对进行比较:文本作为文本,数字作为数字,数字域在排序中应排在文本域之前。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。