关于树Treeview控件的运用。---在线等 ( 积分: 100 )

  • 主题发起人 主题发起人 zhangjensy
  • 开始时间 开始时间
其实,这种问题我当初碰了很多,经过几次痛苦之后,现在已经搞定了,1万条数据也就几秒的时间,详细代码就不说了,思路如下:
1、把数据查询出来的时候,保证了能够按照数据列的特征,分清楚每一个节点的归属;
2、使用TSTRINGLIST,不要直接把数据加载到可视化的树图,ado查询循环的数据直接写入到TSTRINGLIST,按照节点的不同,同时添加tab建,如次节点需要一个tab,其它顺序添加,完成之后TSTRINGLIST.savetofile,TSTRINGLIST.free掉TSTRINGLIST;
3、树图直接tree.loadfromfile,马上搞定
非常快。
 
to wangxumian
我不单只是考虑树的加载显示,还要考虑到和右的Dataset相关!例如在右边增加一条记录保存后,马上也应该在树中显示出来!
现在关键是一次数显示所有节点找不到更好的办法!
 
to zhangjensy
???不是很清楚你的意思,如果是增加一条记录保存后,马上也应该在树中显示出来,那么应该很简单,在dataset的添加之后,按照该记录的属性,找到父节点,直接插入树图就可以了。
 
這麽麻煩啊。。。
 
在線學習。
 
一次性查询出数据
然后使用过滤,可能会快些
if leaf.Level = 0 then
qry.Filter:=Format(belong = ''%s''',['--'])
else
qry.Filter:=Format(belong = ''%d''',[leaf.StateIndex]);
qry.filtered:=true;

唉,我使用过过滤,但时间差不多!不知为什么!
 
http://www.2ccc.com/article.asp?articleid=3850

为什么会找不到呀,另外我是根据它的方法加载到CXTREELIST的
 
to lyplay2,
我是有找到,但发现用索引过滤并不快!和我第一种差不多快!不知为什么!
程序如下:
procedure TFrmcostmaterial.FormShow(Sender: TObject);
var
leaf,subNode: TTreeNode;
tv: TRzTreeView;//引用窗体控件
qry: TADOQuery;//引用窗体控件

procedure AddChildNode(ANode :TTreeNode);
begin
while (ANode <> nil) do
begin //while ANode is not empty
if ANode.Level =0 then
qry.Filter := 'materialparent=1'
else
qry.Filter :=Format('materialparent=%d',[ANode.StateIndex]);
qry.Filtered := True;
if not qry.Eof then
begin //not for empty
while not qry.Eof do
begin //while

with tv.Items.AddChild(ANode,'['+qry.fieldbyname('materialcode').AsString+']'+qry.FieldByName('materialname').AsString
) do
begin
StateIndex := qry.FieldByName('materialid').asinteger;

if qry.fieldbyname('bisended').AsBoolean then
ImageIndex:=1
else
ImageIndex:=0 ;
end;
qry.Next;
end; //while
AddChildNode(ANode.getFirstChild); // 递归
end; //not for empty
ANode := ANode.getNextSibling;
end; //while ANode is not empty
end;

begin
//新算法
tv:=RzTreeView1;
qry:=qmaterial;

tv.Items.BeginUpdate ;
Screen.Cursor := crSQLWait;
try
tv.Items.Clear;
subNode:=tv.Items.AddChild(nil,'['+'Material'+']'+'基本材料资料');

if qry.Active then qry.Active :=false;
qry.SQL.Text :='select * from material where materialparent>0 order by materialparent,materialcode ' ;
qry.Active :=true;
AddChildNode(tv.Items.GetFirstNode);

//新算法
finally
tv.Items.EndUpdate ;
Screen.Cursor := crDefault;
end;
 
你看看最快的那两个
3500条数据,一秒左右时间能加载完
 
to lyplay2
最快那两种不适合我!
 
为什么不适合?你有什么具体要求
 
想问一下:AddObject,AddChild,AddChildObject有什么分别?
with tv.Items.AddChildObject(ANode,PTree(List).Caption,Pointer(ANode.StateIndex)) do StateIndex := PTree(List).ID;
其中的Pointer放在这里是什么意思?后面StateIndex 不是已经赋了值?
 
to lyplay2
我找到了,用了第7種方式,很快,問題終于解決,謝謝各位.
 
后退
顶部