我最近开始编写从列表中填充树视图控件的编码,这是我开始的地方。
http://msmvps.com/blogs/deborahk/archive/2009/11/09/populating-a-treeview-control-from-a-list.aspx
我目前正在尝试检索注册表路径并将它们存储到列表中。从该列表中,我尝试将其添加为树视图控件的父节点。然后我遍历注册表中的每个级别,并将它们添加为节点,最终创建一个树状副本。我正在通过一个单独的进程检索注册表信息,我回避在c#中使用Registry API。我将上面链接中的所有代码合并到我当前的代码中,现在我每次编译时都会遇到无限递归错误。
这是我正在处理的当前代码。
private void registry()
{
string hivelist_output = process.StandardOutput.ReadToEnd();
string[] hivelist_lines = Regex.Split(hivelist_output, "\r\n");
string[] registry_paths = new string[hivelist_lines.Length];
List<string> registry_path_list = new List<string>();
for (i = 0; i < hivelist_lines.Length; i++)
{
registry_paths[i] = hivelist_lines[i].Substring(22);
registry_path_list.Add(registry_paths[i].Trim());
}
for (i = 0; i < registry_path_list.Count; i++)
{
treeViewList.Add(new TreeViewItem()
{
ParentID = 0,
ID = i,
Text = registry_path_list[i]
});
}
PopulateTreeView(0, null);
treeView1.ExpandAll();
}
private void PopulateTreeView(int parentId, TreeNode parentNode)
{
var filteredItems = treeViewList.Where(item => item.ParentID == parentId);
TreeNode childNode = new TreeNode();
foreach (var i in filteredItems.ToList())
{
if (parentNode == null)
childNode = treeView1.Nodes.Add(i.Text);
else
childNode = parentNode.Nodes.Add(i.Text);
PopulateTreeView(i.ID, childNode);
}
}
无限递归的错误指向我这行代码,我不明白为什么。
childNode = parentNode.Nodes.Add(i.Text);
我很感谢你就这件事提出了很好的建议。提前谢谢!
-------------------------------------解决--------- ----------------------------------
继续前进,现在我的下一个问题是在每个父节点(注册表路径)下面添加子项,以及每个先前检索的子项和键值以及数据类型下面的子项。由于注册表很深,我怎么能这样做,以便我绘制所有可能的值而不使用太多的嵌套循环?谢谢!
*我希望实现的结构
registry path
- subkey1
- subkeys of subkey1
- subkeys of subkey1.1
- data types & values
-subkey 2
.
.
.
-subkey 3
.
.
.
-subkey n
- data types & values
某某
答案 0 :(得分:1)
您正在添加ID为0的TreeViewItems 。因此,您的PopulateTreeView始终以ID 0递归调用自身。
您需要修复设置方法:
for (i = 0; i < registry_path_list.Count; i++)
{
treeViewList.Add(new TreeViewItem()
{
ParentID = 0,
ID = 0,
Text = registry_path_list[i]
});
}
并使用相应的ID。