Joh*_*ese 3 c# sorting treeview winforms
我有以下树:
Animals
|
|___Zebra
| |__Head
| |__Arms
| |__Legs
|
|___Monkey
|__Head
|__Arms
|__Legs
Run Code Online (Sandbox Code Playgroud)
每个动物都有存储在标签领域的ID号和他们的名字是node.I的名称字段要按下一个按钮,上面写着"排序ID",并有"斑马"上述转成"14"等,然后以数字方式度假.但是,我希望孩子们保持头部,手臂,腿部的顺序.当我使用下面的代码时,它可以工作,但它也会将头部臂部分重新分成手臂,头部和腿部.我尝试过NodeSorter,但我没有得到任何不同的结果.我也是C#的新手,所以我可能错误地实现了它.:)我也使用一个带有一些额外字段的自定义节点来存储数据和布尔值.这就是下面"JacksNode"所指的内容.
这是代码:
public static void sortByAnimalID(TreeView tv)
{
tv.BeginUpdate();
foreach (TreeNode treeNode in tv.Nodes[0].Nodes)
{
if (((JacksNode)treeNode).IsAnimal)
{
treeNode.Text = Convert.ToString(treeNode.Tag);
treeNode.Name = Convert.ToString(treeNode.Tag);
}
}
tv.Sort();
tv.EndUpdate();
}
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么的任何想法?我在网上搜索了两个星期,并且对所有的treeview文章都感到不知所措.但是,没有一个是具体的.谢谢你们/ gals的任何建议.
使用TreeNode.Level属性来确定如何比较节点属性.像这样:
private void SortButton_Click(object sender, EventArgs e) {
if (treeView1.TreeViewNodeSorter == null) {
treeView1.TreeViewNodeSorter = new NodeSorter();
}
}
private class NodeSorter : System.Collections.IComparer {
public int Compare(object x, object y) {
TreeNode node1 = (TreeNode)x;
TreeNode node2 = (TreeNode)y;
if (node1.Level == 1) {
return Convert.ToInt32(node1.Tag).CompareTo(Convert.ToInt32(node2.Tag));
}
else {
return node1.Index.CompareTo(node2.Index);
}
}
}
Run Code Online (Sandbox Code Playgroud)