我尝试使用C#填充树视图。 我的数据是:
level data
1 xxxx
2 yyyy
3 aaaa
2 rrrr
1 oooo
我想要像:
xxxxx
_yyyy
__aaaa
_rrrrr
ooooo
我使用了这样的代码:
for (int index = 0; index < dt.Rows.Count; index++)
{
TreeNode newNode = new TreeNode(dt.Rows[index]["Item"].ToString());
treeView1.Nodes.Add(newNode);
for (int j = index; j < dt.Rows.Count; j++)
{
TreeNode newNode1 = new TreeNode(dt.Rows[j]["Item"].ToString());
newNode.Nodes.Add(newNode1);
// treeView1.SelectedNode.Nodes.Add(newNode1);
}
}
但结果很糟糕。我只能看到2个级别。
我知道我需要类似递归函数的东西,但我不知道如何通过树并返回到根。
答案 0 :(得分:0)
你应该做那样的事情:
void TraverseTree(TreeNodeCollection nodes)
{
foreach (var child in nodes)
{
DoSomethingWithNode(child);
TraverseTree(child.Nodes);
}
}
并将其命名为:
TraverseTree(MyTreeView.Nodes);
只需用您的逻辑
替换DoSomethingWithNode
方法
答案 1 :(得分:0)
这是一个例子。
Tor测试它假设您拥有Textbox
行中的级别和节点文本。
在测试按钮中单击我首先创建一个List<Tuple<int, string>>
来保存关卡和文本。然后我添加一个根节点并填充树。当然,您可以跳过根节点并为AddNodes
调用添加一些额外的逻辑..
private void testButton_Click(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
treeView1.Nodes.Add("ROOT");
List <string> lines = textBox1.Lines.ToList();
List<Tuple<int, string>> nodes = filleNodesList(lines);
AddNodes(treeView1, treeView1.Nodes[0], nodes);
}
AddNodes
函数是递归的;它在处理后删除第一个条目,并在列表为空时停止。
如果您的等级跳起,则会将错误写入输出窗格..
void AddNodes(TreeView tv, TreeNode cNode, List<Tuple<int, string>> nList)
{
TreeNode nNode = new TreeNode();
int nLevel = cNode.Level;
Tuple<int, string> t = nList[0];
// sibling: add to our parent!
if (t.Item1 == nLevel) { nNode = cNode.Parent.Nodes.Add(t.Item2); }
// next generation: our own child!
else if (t.Item1 == nLevel + 1) { nNode = cNode.Nodes.Add(t.Item2); }
// below us: seek down the line of parents!
else if (t.Item1 < nLevel) {
while (t.Item1 < cNode.Level) cNode = cNode.Parent;
nNode = cNode.Parent.Nodes.Add(t.Item2); }
// more than 1 above: error!
else { Console.WriteLine("Error: node levels must not jump up: " +
nLevel + " --> " + t.Item1); }
// done with this element
nList.RemoveAt(0);
// anything left to do?
if (nList.Count > 0) AddNodes(treeView1, nNode, nList);
}
准备假定第一个字符串是有效的整数..:
List<Tuple<int, string>> filleNodesList(List<string> lines)
{
List<Tuple<int, string>> nodes = new List<Tuple<int, string>>();
foreach(string s in lines)
{
string[] sl = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Tuple<int, string> t =
new Tuple<int, string>(Convert.ToInt16(sl[0].Trim()), sl[1].Trim());
nodes.Add(t);
}
return nodes;
}