Я читал тексты о скрытии и отображении узлов для целей фильтрации, но если мы установим более 2000 строк, чтобы сделать узел видимым/невидимым,
После этого количества строк, когда мы пытаемся вставить ChildNode вверху, он добавляет узел внизу, и узел не отображается в этой строке.
Я просмотрел код VirtualTreeViewCacheThreshold, упомянутый в коде как начальное значение 2000?
Вы можете воспроизвести ошибку, если добавите узлы к первому по функции
Node := PGrid.InsertNode(nil, amAddChildFirst);
вы можете добавить много строк, когда захотите.
Но когда вы сделаете все эти строки видимыми после этой операции,
PGrid.IsVisible[Node] := True
попытка вставить дополнительные корневые узлы (root всегда = nil) будет добавлена в конец и, например, станет невидимым узлом, если количество узлов превысит CacheThreshold.
Показана только белая пустая область для добавления этих ранних детей... в нижней части дерева?
Кроме того, для этой пустой белой области не запускаются события OnGetText, OnPaint?
Я попытался увеличить CacheThreshold, тогда все в порядке с этим увеличенным числом, но после большего числа возникает та же проблема.
[ОТРЕДАКТИРОВАНО]
Если я использую код, как показано ниже, он работает нормально, но требует больше ресурсов ЦП,
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;