我有一个来自TreeView
的控件,它反映了一些分层数据,并以懒惰的方式创建节点。
当一个特定节点被扩展时,我正在检查,它的Nodes
集合中是否有一个虚拟节点,如果是,我正在删除它,从数据源加载数据并创建真正的子节点。
节点的数据加载包含在这种结构中:
Cursor = Cursors.WaitCursor;
BeginUpdate();
try
{
// node.Nodes.Add(...)
}
finally
{
EndUpdate();
Cursor = Cursors.Default;
}
这种方法很好,除了一种情况:用户在节点上按 * (星号),这将加载许多嵌套节点,依此类推。 由于上面的代码,我得到一个闪烁的树视图,有一个正在运行的滚动条。
我想,当扩展所有子节点时,扩展具有ExpandAll
的节点(这是 * 所做的)结束,但这是错误的。
我想知道,如果在TreeView
上按 * ,有没有办法检测扩展结尾?
答案 0 :(得分:0)
你能否检测到在最顶层节点上按下*键并编写循环遍历所有子节点的递归函数,反过来如果这些子节点有更多子节点,再次调用相同的函数,依此类推直到最顶层节点下面的所有节点都已扩展。这将在按下(并检测到)键时扩展所有正在展开的节点,并且它仍将处理您的延迟加载。
答案 1 :(得分:0)
在BeforeExpand事件中,您可以查看selectedNode的当前级别,如果它为零,则它是顶级节点。在这种情况下,您将创建新的子节点并查看它们是否包含其他节点,如果是,则在其中添加虚拟节点。您的代码可能与您当前的代码几乎相同,但是对于0级而不是1级。