2011-09-19 49 views
3

我有以下樹:重新排序樹形節點僅被填充後[0]

Animals 
| 
|___Zebra 
| |__Head 
| |__Arms 
| |__Legs 
| 
|___Monkey 
     |__Head 
     |__Arms 
     |__Legs 

每個動物具有存儲在所述標籤字段的ID號和它們的名稱是在node.I的名稱字段想要按下「按ID排序」並將上面的「Zebra」變成「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(); 
    } 

什麼我做錯了任何想法?我在網上搜索了兩週,並被所有的樹視圖文章淹沒了。但是,沒有一個是這個特定的。 謝謝你們有任何建議。

回答

6

使用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); 
      } 
     } 
    } 
+0

我拿出convert.ToInt32(實際上我用的α-NUMS)和它轉化爲動物標識工作正常。但是,如果我在將名稱換回後使用它,它不會再次排序。這很好,但。我可以使用基本的treeview.Sort()方法,它的工作正常。所以兩個按鈕,而不是一個。對於我正在做的事情來說,這不算什麼大事。我之前曾嘗試過這種解決方案,但我沒有在最後使用else索引比較。我是一個新手!哈哈感謝漢斯,這看起來像會起作用。 –

-1
//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); 
    }