菜鸟使用treeview遇到了麻烦,请高手帮忙!! (180分)

  • 主题发起人 主题发起人 苦命的人
  • 开始时间 开始时间

苦命的人

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormActivate(Sender: TObject);
var
sql,sql1:string;
tempi: integer;
begin
sql:='select * from wuzibianma_dalei';
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(sql);
adoquery1.open;

while not adoquery1.eof do
begin
//加入大类

tempi := tv.Items.AddChild(tv.topitem,adoquery1.fieldbyname('物资大类').asstring).AbsoluteIndex;

sql1:='select * from wuzibianma_zhonglei where 大类代号=:sf';
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sql1);
adoquery2.Parameters.ParamValues['sf']:=adoquery1.fieldbyname('大类代号').asstring;
adoquery2.open;

while not adoquery2.eof do
begin
//加入中类
tv.Items.AddChild(tv.Items.Item[tempi],adoquery2.fieldbyname('物资中类').asstring);
adoquery2.next;
end;
adoquery1.next;
end;
end;

以上的代码,我把数据库里的物资大类全部加到treeview里去了,又把物资中类加到相应的大类里去了,好用,但是我下面的代码是
把物资小类加到相应的物资中类里去,怎么不好使,结果物资小类都加到物资大类去了,请高手挑错!!

procedure TForm1.FormActivate(Sender: TObject);
var
sql,sql1:string;
tempi: integer;
begin
sql:='select * from wuzibianma_dalei';
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(sql);
adoquery1.open;

while not adoquery1.eof do
begin
//加入大类

tempi := tv.Items.AddChild(tv.topitem,adoquery1.fieldbyname('物资大类').asstring).AbsoluteIndex;

sql1:='select * from wuzibianma_zhonglei where 大类代号=:sf';
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sql1);
adoquery2.Parameters.ParamValues['sf']:=adoquery1.fieldbyname('大类代号').asstring;
adoquery2.open;

while not adoquery2.eof do
begin
//加入中类
tv.Items.AddChild(tv.Items.Item[tempi],adoquery2.fieldbyname('物资中类').asstring);

sql1:='select * from wuzibianma_xiaolei where 中类代号=:sf';
adoquery3.close;
adoquery3.sql.clear;
adoquery3.sql.add(sql1);
adoquery3.Parameters.ParamValues['sf']:=adoquery2.fieldbyname('中类代号').asstring;
adoquery3.open;

while not adoquery3.eof do
begin
//加入小类
//应该是在这里出的毛病,就是那个tempi
tv.Items.AddChild(tv.Items.Item[tempi],adoquery3.fieldbyname('物资小类').asstring);

adoquery3.Next;
end;

adoquery2.next;
end;
adoquery1.next;
end;

end;
 
这样不好的,应该先加入大类,点大类时再动态加入中类,点中类时再加入小类!
 
var
xxxxx:TTreeNode;
注意以下 两个 xxxxx 的地方

//加入中类
xxxxx:=tv.Items.AddChild(tv.Items.Item[tempi],adoquery2.fieldbyname('物资中类').asstring);
//===///////////////////////////////////////////
sql1:='select * from wuzibianma_xiaolei where 中类代号=:sf';
adoquery3.close;
adoquery3.sql.clear;
adoquery3.sql.add(sql1);
adoquery3.Parameters.ParamValues['sf']:=adoquery2.fieldbyname('中类代号').asstring;
adoquery3.open;

while not adoquery3.eof do
begin
//加入小类
tv.Items.AddChild(xxxxx,adoquery3.fieldbyname('物资小类').asstring);
/////////////////
adoquery3.Next;
end;

adoquery2.next;
end;
adoquery1.next;
 
加入小类tempi还用的是大类的,当然加到大类里了!
 
jsxjd大侠解决了我的问题,但确实象康凌大侠说的那样,程序变的很慢,康凌大侠能否给我一段
你说的那样解决问题的代码,谢了!!!
 
就是判断点击在哪一个大类上,然后往里加就可以了,代码跟你这个差不多的。
 
把大中小类全放在一个DataSet中,一次性把TreeView填好
 
我可以判断出点击在那个大类上,但我不会往这个节点添入子节点,我知道用这条语句
tv.Items.AddChild(temp,adoquery3.fieldbyname('物资中类').asstring);
但是我点击一个节点后怎么知道temp等于几呢??
如果temp等于tv.topitem,那么就会在第一个节点上添入数据,请问高手temp等于什么会在
选中的项目上添加子项呢?
 
>>但是我点击一个节点后怎么知道temp等于几呢??
temp就等于tv.Selected
[8D]
 
谢谢yyk518大侠

点击要加载子项的节点可以加载数据了,太好了,可是产生了一个小加号,还需要点击一下
小加号才能展开,怎样不用点击小加号就可以直接展开呢?
 

//加入大类
treeview1.items.beginupdate;
.......
........
操作完以后
treeview1.items.endupdate;
这样速度会快点
 
我有另一个建议,使用第三方控件

DxDBTreelist,非常的方便.
 
设计TreeView的自动展开属性为真试试
 
多人接受答案了。
 
后退
顶部