treeview问题(50分)

  • 主题发起人 主题发起人 zhousi
  • 开始时间 开始时间
Z

zhousi

Unregistered / Unconfirmed
GUEST, unregistred user!
用树型结构显示一个表中的数据,例如,一table中有年、月、日三个字段
显示年为第一级,月为第二级,日为第三级,并在selected,第三级时,查询数据库中
符合该年月日的列,[:)]
 
不就三级吗?
select distinct yearfld from yourtable;
装入树中
当你选择某一年时
select distinct monthfld from yourtable where yearfld='****'
装入你选中的年的节点下
以此类推,装入日
当选中的节点的level=2时,就去查询该年月日的数据
 
需要一次装入呀
 
procedure TForm1.Button1Click(Sender: TObject);
var
l_Node1, l_Node2: TTreeNode;
begin
with Query1 do
begin
Close;
SQL.Text := 'select distinct year from table1';
Open;
//第一层
while not Eof do
begin
l_Node1 := TreeView1.Items.Add(nil, FieldByName('year').AsString);
//第二层
with Query2 do
begin
Close;
SQL.Text := 'select distinct month from table1 where year =' + QuotedStr(Query1.FieldByName('Year').AsString);
Open;
//第三层
while not eof do
begin
l_Node2 := TreeView1.Items.AddChild(l_Node1, FieldByName('month').AsString);
with Query3 do
begin
Close;
SQL.Text := 'select distinct day from table1 where month =' + QuotedStr(Query2.FieldByName('Year').AsString) +
' and year=' + QuotedStr(Query1.FieldByName('Year').AsString);
Open;
while not eof do
begin
TreeView1.Items.AddChild(l_Node2, FieldByName('day').AsString);
Next;
end;
Close;
end;
Next;
end;
Close;
end;
Next;
end;
Close;
end;
end;
//不过这样效率太低,还是象twos说的那样比较有效率;
 
query1.sql:
select year, month, day from table1 group by year, month, day order by year, month, day;

得到所有的年月日的组合,然后构成树,

where not(query1.eof) do
begin
if query1.fieldbyname('year') 已经在第一层year中存在 then
begin
treenode:=第一层year的那个node;
if query1.fieldbyname('month') 已经在treenode第二层month中存在 then
begin
treenode2:=第二层month的那个node;
if query1.fieldbyname('day') 已经在treenode2第三层day中存在 then
begin
//continue
end
else
加一个day;
end
else
begin
加一个month;
加一个day;
end;
end
else
begin
加一个year;
加一个month;
加一个day;
end;

query1.next;
end;

点中进行查询就不用写了吧?
 
thanks
svw0506的方法还是不错,因为我的数据量不是太大
最后问一下,level=2时,怎么得到上一级的node呀,有什么事件可以做到呀
 
用DxDBGrid吧,很简单的事情。
 
TreeView1.Selected.Parent.Text 得到上一级的node。

>>>并在selected,第三级时,查询数据库中符合该年月日的列
设第一级level=0(年), 第二级level=1(月) ,第三级level=2(日)

var _day,_month,_year:String;

if TreeView1.Selected<>nil then
if TreeView1.Selected.level=2 then
begin
_day:=TreeView1.Selected.text;
_month:=TreeView1.Selected.Parent.Text;
_year:=TreeView1.Selected.Parent.Parent.Text
end;

SQL 就可以如下:
select year, month, day
from table1
where year=_year and month=_month and day=_day ;-------具体SQL你可再修改!
 
多人接受答案了。
 
后退
顶部