【问题标题】:How do I add Nodes through Backgroundworker to a TreeView from a Database and reload Children while expanding a Node in Windows Forms C#?如何在 Windows 窗体 C# 中扩展节点时通过 Backgroundworker 将节点添加到数据库中的 TreeView 并重新加载子项?
【发布时间】:2011-09-11 11:48:45
【问题描述】:

我有一个 Nhibernate 数据库,它以分层列表的形式提供数据。我的 Windows 窗体 GUI 中有一个 TreeView 和一个 Backgroundworker,它使用所有根节点及其子节点填充 TreeView(仅此而已,因为 NHibernate 的延迟加载异常,但这没关系,因为我希望用户在 TreeView 中有很多节点)。

将根节点及其子节点添加到 TreeView 的过程运行良好,但是当我单击节点展开它时,所有子节点的子节点都应该从数据库加载并添加到 TreeView。从数据库成功请求节点并存储在缓冲区列表中(单击节点展开它时)。

之后,我尝试了一些想法,例如重建 TreeView 并完全重新填充它,但使用此解决方案时,我遇到了所有展开的节点都折叠的问题,因此我尝试存储展开的节点并且它有效。但是我对这个解决方案不太满意,我觉得它可以做得更容易,因为我不想每次用户扩展节点时都重新填充 TreeView。

如何在不重新填充整个 TreeView 的情况下从数据库中重新加载 TreeNode 的子节点并将其显示在 TreeView 中?

【问题讨论】:

  • 延迟加载不是问题,因为我在从数据库初始加载时获得了根节点的子节点。

标签: c# winforms nhibernate treeview backgroundworker


【解决方案1】:

This SO Question 应该对延迟加载提供一些帮助。

它使用线程池而不是后台工作程序,您可以在 google 上找到支持/反对的论据,但在我看来,在 Winforms 中使用线程池是一个不错的选择。

通过以上帖子的指导,将正在扩展的节点传递给 worker。获得填充节点所需的数据后,使用标准 If ##.InvokeRequired Pattern 在节点上执行实际工作。

希望对您有所帮助。

【讨论】:

  • 延迟加载不是问题,因为我得到了根节点的子节点,而子节点的额外加载是问题所在。 (在我的问题中没有提到这一点,我会将其添加为评论)。但是你给了我一个如何用你的“需要调用”提示来解决问题的想法,我会调查一下,谢谢
  • 关于延迟加载,Fredrik Mörk 在我链接的第一篇文章中建议的模式是一种非常流行的模式。如果你这次不使用它,请考虑下次使用它。 ;-) 如果您需要有关 InvokeRequired 模式的更多帮助,请告诉我。祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多