2010-06-14 78 views
3

我在Windows窗體應用程序中顯示TreeView控件,該窗體顯示我自己的TreeNode的子類。我需要顯示一個數字以及每個節點的文本,指示它在樹中的位置,例如根1,第一個孩子1.1,第二個孩子1.2等。我使用.NET 2.0的C#如何根據位置爲TreeNodes分配一個編號方案

我可以想到的最好的方法是,在構建樹後,轉到每個節點,遞歸地查找父節點,並將父節點的兄弟數字追加到節點文本的前面,直到到達根節點。

回答

1

您可以使用擴展名,以便您可以重複使用該代碼,並在任何時候都可以獲取 路徑。

實施不好,但給你一個想法。

public static class Extensions 
    { 
     public static string GetPosition(this TreeNode node) 
     { 
      string Result = ""; 
      BuildPath(node, ref Result); 
      return Result.TrimStart('.'); 
     } 
     private static void BuildPath(TreeNode node,ref string path) 
     { 
      path = "." + node.Index + path; 
      if (node.Parent != null) 
       BuildPath(node.Parent, ref path); 
     } 
    } 
2

您可以繼承TreeNode的子類,根據需要添加屬性和覆蓋。

或者您可以在構建樹時分配數字標籤屬性。該算法將取決於你如何建立樹(自上而下,自下而上等)。

更明確的信息(代碼)將有助於制定更明確的答案。 OP評論後

更新:

對不起,我記錯;你需要重寫TreeView。類似於

public class MyTreeView : System.Windows.Forms.TreeView 
{ 
    // ... 

    protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
    { 
     if (e.Node.Tag != null) 
     { 
      if (e.Node.Tag.GetType() == typeof(MyDataObject)) 
      { 
       MyDataObject data = (MyDataObject)e.Node.Tag; 
       e.Node.Name = data.Number + ". " + data.Name; 
      } 
     } 
    } 
} 
+0

該樹是由自頂向下的遞歸構建的,所以在創建每個節點時,樹中它自己的位置是已知的。 我已經子類化TreeNode添加更多的屬性,所以我需要重寫什麼來改變它在TreeView中顯示的方式?如果我使用下面的路徑構建算法之一,則只需在結果呈現時將結果追加到節點的名稱即可。 – 2010-06-15 18:45:53

0

編寫一個遞歸函數來遍歷樹,傳入每個節點父節點的編號以用作前綴。

void Traverse(TreeNode node, string parentNumber) 
{ 
    string nodeNumber = parentNumber + node.Index.ToString(); 
    node.Text = nodeNumber; 
    string prefix = nodeNumber + "."; 
    foreach (TreeNode childNode in node.Nodes) 
     Traverse(childNode, prefix); 
} 

使用空字符串作爲parentNumber字符串在根TreeNode上調用此函數。