0

我阅读了有关隐藏和显示节点以进行过滤的文本,但如果我们设置超过 2000 行以使节点可见/不可见,

当我们尝试将ChildNode插入顶部时,在这一行之后,它会将节点添加到底部,并且此行中没有显示任何节点。

我查看了代码中提到的VirtualTreeViewCacheThreshold的代码作为init value 2000?

如果将节点添加到第一个函数,则可以重现错误

Node := PGrid.InsertNode(nil, amAddChildFirst);

您可以随时添加很多行。

但是,当您在此操作后将所有这些行设置为可见时,

PGrid.IsVisible[Node] := True

如果节点数达到大于CacheThreshold,则尝试插入更多根节点(始终为 root=nil)将被添加到底部,例如不可见节点。

只有白色空白区域显示添加了这个早期的孩子......在树的底部?

另外,对于这个空白区域,不会触发OnGetTextOnPaint事件吗?

我试图增加CacheThreshold,那么这些增加的数量是可以的,但是在更大的数量之后会出现同样的问题。

[编辑]

如果我使用下面的代码,它可以正常工作,但它会花费更多的 CPU 使用率,

  PGrid.BeginUpdate;
  try
    Node := PGrid.InsertNode(nil, amAddChildFirst);
    Data := PGrid.GetNodeData(Node);
    Data.P := RowInformer;
    RowInformer.pNode := Node;
  finally
    Pgrid.EndUpdate;
  end;

  RowInformer.NodeisVisible;
  RowInformer.InvalidateRow;

但是如果我使用下面的代码,它可以工作一段时间,然后在 2000 年之后变得不稳定(默认缓存阈值),我将节点添加到顶部,但是在 2000 年添加之后,它开始添加到底部并且节点变得不可见,但体积为只有空白区域的行..我想使用代码作为打击来更新只关注的行,但是在 2000 年 NodeisVisible() 函数调用之后它是有问题的

Node := PGrid.InsertNode(nil, amAddChildFirst);
Data := PGrid.GetNodeData(Node);
Data.P := RowInformer;
RowInformer.pNode := Node;
if RowInformer.NodeisVisible then
  begin
      if PGrid.FullyVisible[Node] then
        PGrid.InvalidateNode( Node );
  end;

NodeisVisibleFunction 是:

begin
  Result := True;
  try
        with OwnerGridTable do
        begin
            Result := Result and  Filter_Account.GetFilterResult(PItem.P040_AccountID.AsInteger);
            Result := Result and  Filter_SymbolID.GetFilterResult(PItem.P030_SymbolID.AsInteger);
            Result := Result and  Filter_OrderStatus.GetFilterResult(PItem.P060_OrderStatus.AsOrderStatus);
        end;


  finally

    if Result then
     begin
       if not (vsVisible in pNode.States) then
         OwnerGridTable.PGrid.IsVisible[pNode] := True;
     end
     else
     begin
         if (vsVisible in pNode.States) then
         OwnerGridTable.PGrid.IsVisible[pNode] :=  False;
     end;


  end;
4

0 回答 0