在TreeView上按“*”时如何检测扩展结尾?

时间:2013-03-27 13:05:20

标签: c# .net winforms

我有一个来自TreeView的控件,它反映了一些分层数据,并以懒惰的方式创建节点。
当一个特定节点被扩展时,我正在检查,它的Nodes集合中是否有一个虚拟节点,如果是,我正在删除它,从数据源加载数据并创建真正的子节点。

节点的数据加载包含在这种结构中:

Cursor = Cursors.WaitCursor;
BeginUpdate();
try
{
  // node.Nodes.Add(...)
}
finally
{
  EndUpdate();
  Cursor = Cursors.Default;
}

这种方法很好,除了一种情况:用户在节点上按 * (星号),这将加载许多嵌套节点,依此类推。 由于上面的代码,我得到一个闪烁的树视图,有一个正在运行的滚动条。

我想,当扩展所有子节点时,扩展具有ExpandAll的节点(这是 * 所做的)结束,但这是错误的。

我想知道,如果在TreeView上按 * ,有没有办法检测扩展结尾?

2 个答案:

答案 0 :(得分:0)

你能否检测到在最顶层节点上按下*键并编写循环遍历所有子节点的递归函数,反过来如果这些子节点有更多子节点,再次调用相同的函数,依此类推直到最顶层节点下面的所有节点都已扩展。这将在按下(并检测到)键时扩展所有正在展开的节点,并且它仍将处理您的延迟加载。

答案 1 :(得分:0)

在BeforeExpand事件中,您可以查看selectedNode的当前级别,如果它为零,则它是顶级节点。在这种情况下,您将创建新的子节点并查看它们是否包含其他节点,如果是,则在其中添加虚拟节点。您的代码可能与您当前的代码几乎相同,但是对于0级而不是1级。