在.NET中延迟加载TreeView

时间:2009-04-28 21:43:17

标签: .net treeview

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

我必须遗漏一些东西,因为我无法相信这是那么困难。

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

多年前,当我使用PowerBuilder时,您将HasChildren(或类似)属性设置为true,以便对控件实质上“撒谎”并强制它显示+,然后您可以捕获Expanding事件。当没有子节点时,我无法弄清楚如何强制+出现在节点上。

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

我已经用Google搜索了c#,treeview,延迟,延期,加载,强制,扩展以及其他一些现在没有运气的条款的组合。

P.S。我在SourceForge上找到了TreeViewAdv项目,但是如果可以避免的话,我宁愿不在我们的环境中引入新的组件。

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我同意克里斯的意见,我不得不这样做。加载顶部节点,然后捕获click事件,确保单击位于所选节点上,然后填充节点,最后展开它。

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

答案 2 :(得分:1)

一种可能的解决方案是在树视图之前保持领先一步:

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));
    }
}

答案 3 :(得分:0)

我也想知道如何让+显示在无子节点旁边,但我从未找到过好方法。我的解决方案是像这样处理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

答案 4 :(得分:0)

您是否尝试在BeginUpdate()EndUpdate()来电中附加节点添加内容?这会禁用任何绘制,因此允许您向TreeView添加大量节点,而不会有明显的延迟。

MSDN: TreeView.BeginUpdate Method

答案 5 :(得分:0)

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