代码之家  ›  专栏  ›  技术社区  ›  Craig W.

在.NET中延迟加载TreeView

  •  8
  • Craig W.  · 技术社区  · 15 年前

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

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

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

    几年前,当我使用PowerBuilder时,您会将HasChildren(或类似的)属性设置为“真”,实质上是对控件“撒谎”,并强制它显示+然后您可以捕获扩展事件。当没有子节点的时候,我还没有弄清楚如何强制A+出现在节点上。

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

    我在谷歌上搜索了c_、treeview、delayed、delayed、load、force、expansion等各种组合词,以及其他一些现在没有运气的词。

    另外,我在sourceforge上找到了treeviewadv项目,但是如果我能避免它,我宁愿不在我们的环境中引入一个新的组件。

    6 回复  |  直到 9 年前
        1
  •  4
  •   M. Jahedbozorgan    15 年前

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

        2
  •  2
  •   Joshua Belden    15 年前

    我同意克里斯的观点,我必须做不同的事情。加载顶部节点,然后捕获单击事件,确保单击位于选定节点上,然后填充该节点,最后展开该节点。

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

        3
  •  1
  •   Dries Van Hansewijck    15 年前

    一种可能的解决方案是在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));
        }
    }
    
        4
  •  0
  •   Chris Tybur    15 年前

    我还想知道如何让+出现在无子节点旁边,但我从来没有找到一个好方法。我的解决方案是像这样处理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
    
        5
  •  0
  •   CMerat    15 年前

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

    MSDN: TreeView.BeginUpdate Method

        6
  •  0
  •   leppie    15 年前

    使用treeviewadv(在sourceforge上)可能会有更好的运气。