是否可以隐藏 VirtualStringTree 中的特定节点?我正在实现“过滤”功能(VST 充当带有列的列表),并且我想避免在每次更改过滤器时重新加载内容 - 相反,告诉 VST 不要渲染特定项目要快得多。 ..任何解决方案?
问问题
4322 次
2 回答
16
VirtualTree.IsVisible[Node] := False;
于 2010-06-09T19:09:47.903 回答
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;
希望这有助于对不起英语不好...
于 2014-05-15T23:27:08.100 回答