在.NET中延迟加载TreeView

在.NET中延迟加载TreeView,.net,treeview,.net,Treeview,这是System.Windows.Forms.TreeView,不是WPF或Web TreeView 我一定错过了什么,因为我不敢相信这有那么难 我的表格上有一个树状视图。加载所有数据以填充TreeView非常慢,因此我只想加载顶级节点,然后在用户扩展节点时填充子节点。问题是,如果一个节点没有任何子节点,它不会在节点旁边显示+号,这意味着它不能展开,这意味着我不能展开 捕获扩展事件以加载子级 几年前,当我使用PowerBuilder时,您会将一个HasChildren(或类似)属性设置为true

这是System.Windows.Forms.TreeView,不是WPF或Web TreeView

我一定错过了什么,因为我不敢相信这有那么难

我的表格上有一个树状视图。加载所有数据以填充TreeView非常慢,因此我只想加载顶级节点,然后在用户扩展节点时填充子节点。问题是,如果一个节点没有任何子节点,它不会在节点旁边显示+号,这意味着它不能展开,这意味着我不能展开 捕获扩展事件以加载子级

几年前,当我使用PowerBuilder时,您会将一个HasChildren(或类似)属性设置为true,以实质上“lie”控件,并强制它显示+,然后您可以捕获扩展事件。我不知道如何在没有子节点的情况下强制节点上显示+

我尝试了一种方法,在每个节点上添加一个虚拟节点,然后展开检查虚拟节点是否存在,并将其删除,然后加载子节点,但由于各种原因,不值得在这里讨论,该解决方案在我的情况下不可行

我在谷歌上搜索了c#、treeview、延迟、延迟、加载、强制、扩展和其他一些术语的各种组合,但我现在没有找到这些术语


另外,我在SourceForge上发现了treeview项目,但如果可以避免的话,我不想在我们的环境中引入新组件。

一个可能的解决方案是保持treeview的领先一步:

private void Form1_Load(object sender, EventArgs e)
{
    // initialise the tree here
    var nodeSomething = treeView1.Nodes.Add("Something");
    nodeSomething.Nodes.Add("Something below something");

    treeView1.AfterExpand += AfterExpand;
}

private void AfterExpand(object sender, TreeViewEventArgs e)
{
    foreach (TreeNode node in e.Node.Nodes)
    {
        // skip if we have already loaded data for this node
        if (node.Tag != null) 
            continue;
        node.Tag = new object();
        node.Nodes.AddRange(GetDataForThisNode(node));
    }
}

我还想知道如何让+显示在无子节点旁边,但我从未找到一个好方法。我的解决方案是这样处理MouseDoubleClick事件:

Private Sub tvwMain_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tvwMain.MouseDoubleClick
    Dim oNode As TreeNode

    oNode = tvwMain.GetNodeAt(e.X, e.Y)

    If oNode IsNot Nothing Then
        If oNode.Nodes.Count = 0 Then
            'add children here
        End If
    End If
End Sub

我同意克里斯的观点,我不得不做这件事。加载顶部节点,然后捕获单击事件,确保单击在选定节点上,然后填充该节点,最后将其展开


如果需要加号,则加载顶部节点并在其中放置一个虚拟节点。确保捕获单击或展开事件,清除节点,然后重新填充它。

您是否尝试将节点添加包含在
BeginUpdate()
EndUpdate()调用中?这将禁用任何绘制,因此允许您向TreeView添加大量节点,而不会出现明显的延迟


在启动时加载前2个级别,在节点扩展时加载2个级别。

使用TreeViewAdv(在sourceforge上)可能会更幸运。

我支持虚拟节点的想法。我自己也在使用它,并将Tag属性设置为一个特定的值,以区分“Loading…”虚拟节点与其他节点。在BeforeExpand中,我检查是否存在伪节点并替换内容。我一直使用虚拟节点方法;它通常工作得很好。你能告诉我们为什么它不适合你吗?我认为OP的意思是加载数据本身(例如从DB)很慢,没有添加树节点,所以他们希望按需加载数据(当用户扩展每个树节点时)。Lucas的评论是正确的。树视图本身的填充速度足够快,它获取数据的速度很慢。