VirtualStringTree 如何隐藏节点?

3

在VirtualStringTree中隐藏特定节点是否可能? 我正在实现“过滤”功能(VST作为带有列的列表),我想避免每次更改过滤器时重新加载内容-相反,更快的方法是告诉VST不要渲染特定项...有什么解决方案吗?


9
请注意,当前官方VirtualStringTree版本在节点被隐藏后计算总高度时存在错误。从SVN获取的最新版本已经修复了这个问题。链接:http://code.google.com/p/virtual-treeview - Linas
2个回答

16
VirtualTree.IsVisible[Node] := False;

谢谢!我正在寻找以“visible”开头的东西;) - migajek
1
使用.IsVisible[]可以增加一个点,从而调整树形视图画布的总高度,使垂直滚动条反映出隐藏的节点。如果仅仅使用Exclude(Node.States, vsVisible)Node.States := Node.States - vsVisible来移除节点的可见状态,则不会调整树形视图的画布高度,垂直滚动条也不会改变,用户可能会在最后显示的节点下面看到很多空白。 - James L.

0

在使用.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;

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

它之所以很慢,是因为你在循环中不断重绘和重新计算贫弱的树!别这样做!像对待其他VCL部件(如tstringgridtstringlist等)一样处理它。TV.BeginUpdate; try for Node in TV.Nodes do begin Data := .. end finally TV.EndUpdate end - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接