我在Windows窗体应用程序中有一个TreeView控件,它显示我自己的TreeNode子类。我需要显示一个数字以及每个节点的文本,指示它在树中的位置,例如1表示根,1表示第一个子节点,1.2表示其第二个子节点等。我正在使用C#和.NET 2.0
我能想到的最好的方法是,在构建树之后,转到每个节点,递归地找到父节点并将父节点的兄弟节点号附加到节点文本的前面,直到到达根节点。
答案 0 :(得分:2)
您可以继承TreeNode,根据需要添加属性和覆盖。
或者您可以在构建树时指定数字Tag属性。该算法将取决于您如何构建树(自上而下与自下而上等)。
更明确的信息(代码)有助于制定更明确的答案。
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;
}
}
}
}
答案 1 :(得分: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 :(得分: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);
}
在根TreeNode上调用此方法,并将空字符串作为parentNumber字符串。