这是一个例子。
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;
}