【问题标题】:How to traverse a treeview and get values from all nodes如何遍历树视图并从所有节点获取值
【发布时间】:2017-04-30 15:57:46
【问题描述】:

无论我怎么问,我都找不到这个问题的答案。如果树视图在 WinForms 中,似乎有解决方案,但在 WPF 中则没有。

我正在运行时加载一个绑定到名为 OOB 的树视图的 XML 文件。用户可以对树形视图进行各种编辑(添加和删除节点,更改节点的内容等)。所有这一切都完美无缺。现在,我必须将它保存为 XML 文件。显然,这在 WPF 中几乎是不可能的。

此时我所能想到的就是遍历整个树(根据我的阅读,可能需要先展开所有节点,这很容易完成),然后我可以一个一个地阅读节点并使用 xmlWriter 将它们写入 XML 文件。

所以,除非有人有更好的主意,否则我如何在 C# 和 WPF 中遍历整个树,获取每个 Node.name 的内容?一旦我有了每个节点的内容,我应该能够重新构建树结构并将它们写成 XML 文件。

【问题讨论】:

  • 通常会将树视图绑定到某个底层数据模型并保存该数据模型。参见例如wpf treeview bindinghow to bind dynamic json into treeview wpfcodeproject.com/Articles/26288/…。但我认为你应该能够使用this question 中的FindVisualChildren<TreeViewItem>(treeView) 来获取TreeView 的所有TreeViewItem 子级。
  • 通常,您会发现人们仅在必要时才评论否决票。通常,一个接近投票足以表明帖子中缺少什么(你有两个反对票和两个接近投票,所以那里似乎是平等的)。请注意,SO 问题不应包含与当前问题直接相关的任何内容。我已代表您编辑了您的问题以改进它,使其符合社区标准。根据手头的证据,我会说你的问题太宽泛而没有包括一个好的minimal reproducible example。另请参阅How to Ask,包括末尾的链接

标签: c# xml wpf treeview


【解决方案1】:

尝试这些解决方案之一

IEnumerable<TreeNode> Collect(TreeNodeCollection nodes)
{
    foreach(TreeNode node in nodes)
    {
        yield return node;

        foreach (var child in Collect(node.Nodes))
            yield return child;
    }
}

另一种解决方案

protected void TraverseNodes(TreeNodeCollection nodes, string action, int maxDepth = 2) 
    {
        foreach (TreeNode node in nodes)
        {
            if (node.ChildNodes.Count > 0 && node.Depth < maxDepth)
                TraverseNodes(node.ChildNodes, action, maxDepth);

            //do something!!!
            var x = node.Text;
            node.Checked = !node.Checked;
        }
    }

【讨论】:

  • TreeNodeCollection 仅存在于 WinForms 中。这是针对 WPF 的。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多