Windows 窗体 TreeView - 绑定分层递归数据源
Posted
技术标签:
【中文标题】Windows 窗体 TreeView - 绑定分层递归数据源【英文标题】:Windows Forms TreeView - Bind hierarchical recursive datasource 【发布时间】:2013-10-21 09:47:56 【问题描述】:我正在 Windows 窗体中转换 WPF 客户端,但在尝试复制 TreeView 控件结构时遇到了一些问题。
在第一个项目中,我有一个自定义工厂,它从基本上是 XML 的输入字符串开始构建结构。 返回类型是一个集合。 自定义树节点:
public class TreeViewNode
public TreeViewNode()
public DocumentKey DocKey get; set;
public string Text get; set;
public IList<TreeViewNode> Children get; set;
工厂:
public class TreeViewFactory
public IList<TreeViewNode> GetSctructure(DocumentKey docKey, string structure, bool loadAllParents)
XDocument xmlDocstructure = CommonXmlValueParser.GetXDocument(structure);
var parentsNodes = (from item in xmlDocstructure.Descendants("structure_item")
where (CommonXmlValueParser.GetAttribute(item, "level") == "1")
select new TreeViewNode
Text = GetNodeText(item),
DocKey = new DocumentKey()
Bank = docKey.Bank,
Ud = int.Parse(CommonXmlValueParser.GetElement(item.Element("ud"))),
Master = int.Parse(CommonXmlValueParser.GetElement(item.Element("master"))),
NVig = int.Parse(CommonXmlValueParser.GetElement(item.Element("nvig"))),
Subjects = docKey.Subjects
,
Children = GetChildrenNodes(item, 2, docKey.Bank)
).ToList();
return parentsNodes;
private IList<TreeViewNode> GetChildrenNodes(XElement element, int level, int dataBank)
var childrenNodes = (from item in element.Descendants("structure_item")
where (CommonXmlValueParser.GetAttribute(item, "level") == level.ToString())
select new TreeViewNode
Text = GetNodeText(item),
DocKey = new DocumentKey()
Bank = dataBank,
Ud = int.Parse(CommonXmlValueParser.GetElement(item.Element("ud"))),
Master = int.Parse(CommonXmlValueParser.GetElement(item.Element("master"))),
NVig = int.Parse(CommonXmlValueParser.GetElement(item.Element("nvig"))),
,
Children = GetChildrenNodes(item, level + 1, dataBank)
).ToList();
return childrenNodes;
绑定:
void CreateTree(object tree, EventArgs e)
//...
TreeViewFactory treeFactory = new TreeViewFactory();
var documentStructure = treeFactory.Structure(document.DocumentKey, document.XmlStructure, true);
this.tabMainControl.document.SetTreeViewStructureNodes(documentStructure);
public void SetTreeViewStructureNodes(IList<TreeViewNode> nodes)
this.treeView.ItemsSource = nodes;
更新:
我让 TreeViewNode 派生自 TreeNode 并更改了 SetTreeViewStructureNodes 方法:
private TreeView SetTreeViewStructureNodes(IList<TreeViewNode> nodes)
TreeView treeView = new TreeView();
treeView.Nodes.AddRange(nodes.ToArray());
return treeView;
仍然没有达到我的目标,因为它还没有被渲染......
据我所知,在 Windows 窗体中,不可能将一种数据源关联为任何类型的集合(实现 IEnumerable)。 除了使用 3rd 方组件,我该如何解决我的问题。我在 WinForms 上的经验很短,当我学会管理更好的 WPF 时,他们决定改变它:(
感谢您的所有帮助,问候。
更新2: 填充 treeView 的 WinForms 用户控件:
TreeView treeView = (TreeView)documentViewControl.Controls["treeViewStructure"];
TreeViewFactory treeFactory = new TreeViewFactory();
var documentStructure = treeFactory.GetStructure(document.DocumentKey, document.XmlStructure, true);
treeView = this.SetTreeViewStructureNodes(documentStructure);
基本上我是从一个 UC 转到另一个。它们都是 2 个 Tabs 的一部分,是 TabControl 的子级。
【问题讨论】:
所有 cmets 怎么样? O_o'' 4天过去了,没人能回答这个问题吗?我想知道所有winform大师都藏在哪里......我刚刚为此开了一个赏金。为了让您意识到所有可能的答案都需要大量不需要的代码,并且您真的不应该从 21 世纪的 WPF 切换回可怕的古老石器时代的 winforms。 好的,如果您已经解决了这个问题,请删除问题或发布答案。我仍在试图理解为什么有人会从 WPF 回到 winforms... 私有 TreeNode[] GetTreeViewNodes(IList(由 OP 作为问题编辑回答。转换为社区 wiki 答案。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP 写道:
其实我是自己搞定的。这个想法是改变 ricursive 的想法,从 TreeViewNodes 的集合 (IList) 创建一个 TreeNode。问题1:递归问题2:如何维护DocKey自定义属性
private TreeNode[] GetTreeViewNodes(IList<TreeViewNode> nodes)
IList<TreeNode> returnedNodes = new List<TreeNode>();
foreach (var item in nodes)
TreeNode node = new TreeNode(item.Text, this.GetTreeViewNodes(item.Children));
node.Tag = item.DocKey;
returnedNodes.Add(node);
return returnedNodes.ToArray();
而树视图所需的代码变成了这个:
this.treeView.Nodes.Clear();
this.treeView.Nodes.AddRange(this.GetTreeViewNodes(documentStructure));
【讨论】:
以上是关于Windows 窗体 TreeView - 绑定分层递归数据源的主要内容,如果未能解决你的问题,请参考以下文章