treeview中当单击一个节点时,显示其孩子;当单击另一个节点时,刚才显示的那个节点孩子消失,显示现在所选则的节点的孩子?如何实现?如下示:
+--某大学
|__A班
|
|__B班
当选A班时显示
+--某大学
|___A班
| |__学生2
| |__学生1
|
+----B班
当选VB时显示
+--某大学
|___A班
|
+----B班
|__学生2
|__学生1
注:学生在一张表中,有字段判断是哪个班的,班级在另一个表中!
+--某大学
|__A班
|
|__B班
当选A班时显示
+--某大学
|___A班
| |__学生2
| |__学生1
|
+----B班
当选VB时显示
+--某大学
|___A班
|
+----B班
|__学生2
|__学生1
注:学生在一张表中,有字段判断是哪个班的,班级在另一个表中!
procedure TEditGroupDialog.RzTreeView1Change(Sender: TObject;
Node: TTreeNode);
var Dataset_sql,Dataset_Par: string;
begin
if not RzTreeView1.Selected.IsFirstNode then
begin
Dataset_Par := RzTreeView1.Selected.Text;
Dataset_sql := 'select * from aPeople where aGroup = ' + ' " ' + DataSet_Par + ' " ';
ADOQuyDataset.SQL.Text := Dataset_sql;
ADOQuyDataset.Close;
ADOQuyDataset.Open;
ADOQuydataset.First;
while not ADOQuyDataset.Eof do
begin
RzTreeView1.Items.AddChild(RzTreeView1.Selected, ADOQuyDataset.FieldByName('name').AsString);
ADOQuyDataset.Next;
end;
ADOQuyDataset.close;
end;
end;
你还没有弄清楚我的意思,自动展开无所谓,只要保证a和b中只有一个节点有孩子!
也就是说,上面当选a时,b中的孩子根本不显示(b旁边没有加号),当选b时,a中的孩子根本不显示(a旁边没有加号).
你的意思就是在生成B孩子时在删除A的孩子,当然可以做到,但是不知道有什么作用,其实设置
autoexpend属性为true.就可以在选择b时收起a了,下面把你的稍微改了一下:
procedure TEditGroupDialog.RzTreeView1Change(Sender: TObject;
Node: TTreeNode);
var Dataset_sql,Dataset_Par: string;
begin
if not RzTreeView1.Selected.IsFirstNode then
begin
Dataset_Par := RzTreeView1.Selected.Text;
Dataset_sql := 'select * from aPeople where aGroup = ' + ' " ' + DataSet_Par + ' " ';
ADOQuyDataset.Close;
ADOQuyDataset.Clear;
ADOQuyDataset.SQL.Text := Dataset_sql;
ADOQuyDataset.Open;
ADOQuydataset.First;
while not ADOQuyDataset.Eof do
begin
RzTreeView1.Items.AddChild(RzTreeView1.Selected, ADOQuyDataset.FieldByName('name').AsString);
ADOQuyDataset.Next;
end;
ADOQuyDataset.close;
end;
end;
但是我不是想仅仅得的不显示,我还想在数据集中和树中删除刚才得到的数据!!!
多谢大家了!!!
这样的话, 可以在点击结点的时候再生成该结点的子结点
但是, 并不需要在每次点击结点的时候都做实时的数据库查询, 第一次点击该结点时查询数据库, 并生成子结点, 此时把查询到的数据放到子结点的Data指针域中, 第二次点击该结点的时候直接从Data指针域中取数据就好了, 有一点要注意: 数据库更新后要更新对应的Data指针域另外, 基本也不必在点击另一个结点的时候, 把原来展开的结点的子结点删除, 这样也会影响速度的; 如果数据缺少太大的话, 可以设定一个大小范围, 当打开的子结点超出这个范围的话再删除一定数量的子结点, 如果用Data指针域的话, 删除子结点的时候别忘了 Dispose该Data指针.
问题已经解决了,我的代码可以用,主要是因为我用的oracle数据库,字符串方面有点问题,现在的问题,就是如何判断哪个节点有孩子?
应该分两种情况
1.窗体刚初始化,没有节点被选择过。
2.已经有节点被选择过,(这个该如何判断呢?)
逐步查找。。tempNode:=TreeView1.Selected;
tempNode.Count<>0?;