VirtualStringTree隐藏节点

时间:2010-06-09 19:05:02

标签: delphi virtualtreeview

是否可以隐藏VirtualStringTree中的特定节点? 我正在实现“过滤”功能(VST充当带列的列表),并且我希望每次更改过滤器时都避免重新加载内容 - 相反,更快的是告诉VST不要呈现特定项目。 ..任何解决方案?

2 个答案:

答案 0 :(得分:16)

VirtualTree.IsVisible[Node] := False;

答案 1 :(得分:1)

使用.IsVisible []或.IsFiltered []存在问题,这是非常慢的,我在一个树中探测过滤器,其中有25,000个节点并且速度太慢。

我发现使用Include(Node.states,vsFiltered)或使用(Node.States,vsVisible)时,滚动条大小更快并解决了问题,它包含手动更改Node.TotalHeight值根据可见节点的数量(未过滤)。

例如,我正在过滤25,000个节点,我使用的代码如下:

procedure TFC_Articulo.Filtrar(Filtro:String);
var
 Node:PVirtualNode;
 Data:PArticulo;
begin
  Node := TV.GetFirst;
  TV.RootNode.TotalHeight:=TV.DefaultNodeHeight;  // The Trick
  while Assigned(Node) do
  begin
    Data:=TV.GetNodeData(Node);
    Exclude(Node.States,vsFiltered);     // By default all nodes wil be Visible
    if ComparationHereForDetermineFiltering then
       Include(Node.States,vsFiltered)   // This node wil be filtered
    else
       Inc(TV.RootNode.TotalHeight,Node.NodeHeight);  // Determine the Height of scrollbar
    Node:=TV.GetNext(Node);
  end;
  TV.RootNode.TotalHeight:=TV.RootNode.TotalHeight+TV.BottomSpace;
  TV.UpdateScrollBars(True);
end;

希望这会有所帮助 抱歉英语不好......