如何通过Backgroundworker将节点从数据库添加到TreeView,并在Windows窗体C#中展开节点时重新
本文关键字:节点 窗体 Windows 并在 Backgroundworker 何通过 数据库 TreeView 添加 | 更新日期: 2023-09-27 17:58:48
我有一个Nhibernate数据库,它以分层列表的形式提供数据<>。我在Windows窗体GUI中有一个TreeView,还有一个Backgroundworker,它用所有根节点及其子节点填充TreeView(这只是因为NHibernate的Lazy加载异常,但这没关系,因为我预计用户在TreeView中会有很多节点)。
将根节点及其子节点添加到TreeView的过程运行得很好,但当我单击节点展开它时,子节点的所有子节点都应该从数据库中加载并添加到TreeView。成功地从数据库请求了节点,并将其存储在缓冲区列表中(单击节点以展开它时)。
在那之后,我尝试了一些想法,比如重建TreeView并完全重新填充它,但通过这个解决方案,我遇到了所有展开的节点都被折叠的问题,所以我尝试存储展开的节点,它成功了。但我对这个解决方案不太满意,我觉得它可以更容易地完成,因为我不想每次用户扩展节点时都重新填充TreeView。
如何从数据库中重新加载树节点的子节点并将其显示在树视图中,而不重新填充整个树视图?
这个SO问题应该能为延迟加载提供一些帮助。
它使用线程池而不是后台工作者,你可以在谷歌上找到支持/反对的论据,但在我看来,在Winforms中使用线程池并不是一个糟糕的选择。
有了上面的帖子来指导你,把正在扩展的节点传递给worker。一旦有了填充节点所需的数据,就可以使用标准的If###.InvokeRequired模式在节点上执行实际工作。
希望能有所帮助。