只在被填充后重新排序树视图节点[0]
本文关键字:视图 节点 排序 填充 新排序 | 更新日期: 2023-09-27 18:08:56
我有以下树:
Animals
|
|___Zebra
| |__Head
| |__Arms
| |__Legs
|
|___Monkey
|__Head
|__Arms
|__Legs
每个动物都有一个ID号存储在Tag字段中,它们的名字存储在节点的name字段中。我想按下一个按钮,说"按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();
}
你知道我做错了什么吗?我已经在网上搜索了两个星期,已经被所有的树视图文章淹没了。然而,没有一个是这么具体的。谢谢大家的建议。
使用TreeNode。级别属性以确定如何比较节点属性。这样的:
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);
}
}
}
//bubble sort
public void Sort_TV_ByTag(TreeNodeCollection treeNodeCollection)
{
int i, j;
int n = treeNodeCollection.Count;
for (i = 0; i < n; i++)
{
for (j = 1; j < (n - i); j++)
{
int firstValue = int.Parse(treeNodeCollection[j - 1].Tag.ToString());
int secondValue = int.Parse(treeNodeCollection[j].Tag.ToString());
//you can compare by Tag , Text , anything
if (firstValue > secondValue)
{
//swap the nodes
TreeNode n1 = treeNodeCollection[j - 1];
TreeNode n2 = treeNodeCollection[j];
treeNodeCollection.Remove(n1);
treeNodeCollection.Remove(n2);
treeNodeCollection.Insert(j, n1);
treeNodeCollection.Insert(j - 1, n2);
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
Sort_TV_ByTag(treeView1.Nodes[0].Nodes);
}