我阅读了有关隐藏和显示节点以进行过滤的文本,但如果我们设置超过 2000 行以使节点可见/不可见,
当我们尝试将ChildNode插入顶部时,在这一行之后,它会将节点添加到底部,并且此行中没有显示任何节点。
我查看了代码中提到的VirtualTreeView → CacheThreshold的代码作为init value 2000?
如果将节点添加到第一个函数,则可以重现错误
Node := PGrid.InsertNode(nil, amAddChildFirst);
您可以随时添加很多行。
但是,当您在此操作后将所有这些行设置为可见时,
PGrid.IsVisible[Node] := True
如果节点数达到大于CacheThreshold,则尝试插入更多根节点(始终为 root=nil)将被添加到底部,例如不可见节点。
只有白色空白区域显示添加了这个早期的孩子......在树的底部?
另外,对于这个空白区域,不会触发OnGetText、OnPaint事件吗?
我试图增加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;