如何在C#中将TreeView按字母排序且W开头节点置顶?
TreeView自定义排序:将W开头的节点置于顶部
你的代码有几个关键问题导致没达到预期效果:
- 用了
Contains("W")而非StartsWith("W"),会把名字里包含W的节点都纳入判断,而非仅以W开头的节点 - 逻辑判断完全偏离需求,错误引入了Z的判断条件,且分支逻辑覆盖不全
- 混淆了
Name和Text属性,排序时未统一使用同一个字段 - 不符合条件就返回0,会让TreeView认为这些节点排序优先级相同,导致顺序混乱
下面是修正后的排序器代码,实现所有以W开头的节点排在最顶部,其余节点按字母正常排序:
public int Compare(object thisObj, object otherObj) { TreeNode thisNode = thisObj as TreeNode; TreeNode otherNode = otherObj as TreeNode; // 判断节点文本是否以W开头(忽略大小写可加第二个参数,不需要则删除) bool thisStartsWithW = thisNode.Text.StartsWith("W", StringComparison.OrdinalIgnoreCase); bool otherStartsWithW = otherNode.Text.StartsWith("W", StringComparison.OrdinalIgnoreCase); if (thisStartsWithW && !otherStartsWithW) { // 当前节点以W开头,另一个不是,当前节点排前面 return -1; } else if (!thisStartsWithW && otherStartsWithW) { // 当前节点不以W开头,另一个是,另一个节点排前面 return 1; } else { // 两个都以W开头或都不以,按字母顺序排序 return string.Compare(thisNode.Text, otherNode.Text, StringComparison.OrdinalIgnoreCase); } }
细节说明:
- 如果需要区分大小写排序,删除
StringComparison.OrdinalIgnoreCase参数即可 - 若实际需按
Name属性排序,将代码中所有Text替换为Name即可
内容的提问来源于stack exchange,提问作者practice projects
相关产品推荐
相关产品推荐

