绑定TreeView?

4
我正在尝试为我的IRC客户端构建服务器/网络设置系统。由于网络和服务器之间的关系性质,我选择使用SQLite来存储所有信息。
我的第一步是创建设置对话框,就像你所期望的那样;一个TreeView用于保存网络和服务器,以及一个侧边栏来编辑它们的设置。
我有一点使用ADO.NET的经验,但只是基本的选择和更新,并没有关系型经验。因此,我的问题是如何将行与TreeNode相关联。我已经为服务器和网络创建了自定义的TreeNode对象,并且在一些手动输入数据方面都很好用。
所以我想我不需要"绑定",我只需要加载数据到TreeView中并能够轻松地更新设置。
2个回答

3
在我们的项目中,我们通常使用TreeNode的Tag属性将行与TreeNode关联起来,并手动将数据加载到TreeView中而不是进行绑定。

3
在填充TreeView时,主要问题是是否要完全加载所有节点,还是在展开每个节点时实现某种惰性加载方法。
如果您的节点少于约500个且节点数不会增加,则仅填充完整树才能正常运行。否则最好采用惰性加载方法。
最简单的方法是在BeforeExpand事件中填充节点的子项。但是,TreeView不会显示+/-指示节点具有子项,直到您实际添加子项为止。因此,在填充父节点时,应检查逻辑项(数据行)是否具有子项,如果有,则添加一个虚拟节点。
我发现从TreeNode继承自定义类是定义虚拟节点的最简单方法之一。然后,您可以在BeforeExpand()中使用Is运算符检查它。
然后,当用户展开父节点时,在BeforeExpand事件中检查是否有虚拟节点,如果有,则删除它,然后填充实际节点。对于这些节点中的每一个节点,都要检查其子项并填充标记属性和必要的虚拟节点。
为每个节点设置Tag属性以表示某种有意义的对象/数据。这将使您在需要时轻松填充子节点。只需注意它是对象类型,需要在需要时正确地将其转换为实际数据类型。

我之前没有考虑到你所说的“延迟加载”,谢谢提醒。关于Tag属性,我已经有自定义的TreeNode对象了,所以这并不是必要的。这样我就可以轻松地知道点击了什么,哪些文本框需要在表单的另一侧显示。至于数据库方面,我还不确定我应该将Tag属性设置为什么,正如你所建议的那样。 - Brian Ortiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接