我在Windows窗體應用程序中顯示TreeView控件,該窗體顯示我自己的TreeNode的子類。我需要顯示一個數字以及每個節點的文本,指示它在樹中的位置,例如根1,第一個孩子1.1,第二個孩子1.2等。我使用.NET 2.0的C#如何根據位置爲TreeNodes分配一個編號方案
我可以想到的最好的方法是,在構建樹後,轉到每個節點,遞歸地查找父節點,並將父節點的兄弟數字追加到節點文本的前面,直到到達根節點。
我在Windows窗體應用程序中顯示TreeView控件,該窗體顯示我自己的TreeNode的子類。我需要顯示一個數字以及每個節點的文本,指示它在樹中的位置,例如根1,第一個孩子1.1,第二個孩子1.2等。我使用.NET 2.0的C#如何根據位置爲TreeNodes分配一個編號方案
我可以想到的最好的方法是,在構建樹後,轉到每個節點,遞歸地查找父節點,並將父節點的兄弟數字追加到節點文本的前面,直到到達根節點。
您可以使用擴展名,以便您可以重複使用該代碼,並在任何時候都可以獲取 路徑。
實施不好,但給你一個想法。
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);
}
}
您可以繼承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;
}
}
}
}
編寫一個遞歸函數來遍歷樹,傳入每個節點父節點的編號以用作前綴。
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上調用此函數。
該樹是由自頂向下的遞歸構建的,所以在創建每個節點時,樹中它自己的位置是已知的。 我已經子類化TreeNode添加更多的屬性,所以我需要重寫什麼來改變它在TreeView中顯示的方式?如果我使用下面的路徑構建算法之一,則只需在結果呈現時將結果追加到節點的名稱即可。 – 2010-06-15 18:45:53