【问题标题】:VirtualStringTree hide node(s)VirtualStringTree 隐藏节点
【发布时间】:2010-06-09 19:05:02
【问题描述】:

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

【问题讨论】:

  • 请注意,如果节点不可见,当前的官方 VirtualStringTree 版本会错误地计算总高度。 SVN 的最新版本修复了这个问题。链接:code.google.com/p/virtual-treeview

标签: delphi virtualtreeview


【解决方案1】:
VirtualTree.IsVisible[Node] := False;

【讨论】:

  • 谢谢!我正在寻找以“可见”开头的东西;)
  • +1 用于使用.IsVisible[],它调整树视图画布的整体高度,以便垂直滚动条将反映隐藏的节点。如果您只是使用Exclude(Node.States, vsVisible)Node.States := Node.States - vsVisible 从节点中删除可见状态,它不会调整树视图的画布高度,垂直滚动条不会改变,并且用户可能会在下面有很多空白最后显示的节点。
【解决方案2】:

使用 .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-12-13
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多