在VirtualStringTree中隐藏特定节点是否可能? 我正在实现“过滤”功能(VST作为带有列的列表),我想避免每次更改过滤器时重新加载内容-相反,更快的方法是告诉VST不要渲染特定项...有什么解决方案吗?
在VirtualStringTree中隐藏特定节点是否可能? 我正在实现“过滤”功能(VST作为带有列的列表),我想避免每次更改过滤器时重新加载内容-相反,更快的方法是告诉VST不要渲染特定项...有什么解决方案吗?
VirtualTree.IsVisible[Node] := False;
.IsVisible[]
可以增加一个点,从而调整树形视图画布的总高度,使垂直滚动条反映出隐藏的节点。如果仅仅使用Exclude(Node.States, vsVisible)
或Node.States := Node.States - vsVisible
来移除节点的可见状态,则不会调整树形视图的画布高度,垂直滚动条也不会改变,用户可能会在最后显示的节点下面看到很多空白。 - James L.在使用.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;
tstringgrid
、tstringlist
等)一样处理它。TV.BeginUpdate; try for Node in TV.Nodes do begin Data := .. end finally TV.EndUpdate end
- undefined