这是一个System.Windows.Forms.TreeView,而不是WPF或Web TreeView。
我必须遗漏一些东西,因为我无法相信这是那么困难。
我的表单上有一个TreeView。加载填充TreeView的所有数据非常慢,因此我只想加载顶级节点,然后在用户展开节点时填充子节点。问题是,如果一个节点没有任何子节点,它不会在节点旁边显示+号,这意味着它无法展开,这意味着我不能 捕获扩展事件以加载子项。
多年前,当我使用PowerBuilder时,您将HasChildren(或类似)属性设置为true,以便对控件实质上“撒谎”并强制它显示+,然后您可以捕获Expanding事件。当没有子节点时,我无法弄清楚如何强制+出现在节点上。
我尝试了一种方法,我在每个节点上添加一个虚拟节点,然后在扩展检查虚拟节点是否存在并删除它然后加载子节点,但由于各种原因不值得进入这里解决方案在我的情况下是不可行的。
我已经用Google搜索了c#,treeview,延迟,延期,加载,强制,扩展以及其他一些现在没有运气的条款的组合。
P.S。我在SourceForge上找到了TreeViewAdv项目,但是如果可以避免的话,我宁愿不在我们的环境中引入新的组件。
答案 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添加大量节点,而不会有明显的延迟。
答案 5 :(得分:0)
使用TreeViewAdv(在sourceforge上)可能会有更好的运气。