我需要在TVirtualStringTree
中显示一个长数据库表(例如50000条记录)。为了减少查询执行时间,我限制了记录的数量,仅使用树中实际显示的记录。下面是处理OnGetText
的代码段。问题是VisibleCount
返回50000而不是20-30,这破坏了这种方法。有办法正确执行吗?
procedure TContactsFrame.vstContactsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
begin
if vstContacts.GetNodeLevel(Node) = 0 then
CellText := 'Group'
else if vstContacts.GetNodeLevel(Node) = 1 then
begin
if Contacts[Node.Index].Index = -1 then
begin
// getting DB table values of visible records only
GetContacts(Node.Index + 1, Node.Index + 1 + vstContacts.VisibleCount, Contacts);
end;
CellText := Contacts[Node.Index].Name;
end;
end;
答案 0 :(得分:2)
VisibleCount
为您提供了设置了vsVisible
标志(可见表示不隐藏)的节点数。
要枚举当前显示在树视图中的节点,可以使用TopNode
和BottomNode
,其方式类似于:
var
Run, LastNode: PVirtualNode;
begin
LastNode := Treeview.GetNextVisible(Treeview.BottomNode);
Run := Treeview.TopNode;
while Assigned(Run) do
begin
// your processing here
Run := Treeview.GetNextVisible(Run);
if Run = LastNode then
Break;
end;
end;
答案 1 :(得分:1)
要查找显示的节点数,您需要编写自己的函数,但是在这种情况下,使用TopNode
和BottomNode
或{ {1}}和GetFirst
(如果不存在)。
GetLast
但是,我不得不说这似乎不是最有效的解决方案,因为您在随意滚动树时将运行数千个查询。如果有的话,我会乘以检索到的联系人的数量,因此您不需要那么频繁地运行新查询。