关于TTreeView的问题

iranjn 2005-12-05 09:43:59
我想实现这样的功能:
->2004销售额
->->2004年1月销售额
.....
->->2004年12月销售额
->2005销售额
->->2005年1月销售额
.....
->->2005年12月销售额
我的代码如下:
ADOQ1.Close;
ADOQ1.SQL.Text := ' select * from CYearMsg order by YearName ';
ADOQ1.Open;
ADOQ1.First;
YCount := ADOQ1.RecordCount;
for i:= 0 to ADOQ1.RecordCount-1 do
begin
TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;
TreeView1.Items[I].ImageIndex := ADOQ1.FieldByName('YearName').AsInteger;
ADOQ1.Next;
end;
ADOQ2.Close;
ADOQ2.SQL.Text := ' select * from CMonthMsg order by MonthName ';
ADOQ2.Open;
ADOQ2.First;
for i:= 0 to ADOQ2.RecordCount-1 do
begin
for j:= 0 to YCount-1 do
if Pos(InttoStr(TreeView1.Items[j].ImageIndex),ADOQ2.FieldByName('MonthName').AsString) >0 then
begin

TreeView1.Items.AddChild(TreeView1.Items[j],ADOQ2.FieldByName('MonthName').AsString+'销售额:'+ADOQ2.FieldByName('MNY').AsString);
end;
ADOQ2.Next;

end;

出来的效果是:

->2004销售额
->->2004年1月销售额
->->->2004年1月
->->->->2004年1月
……
->->->->2005年12月
->->->2004年2月
……
->->->2005年12月



.....
->->2004年12月销售额
->2005销售额
都跑到第一个节点去了,这个根据上面的代码该怎么该才能出现我想要的结果?
...全文
208 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmzgz81 2005-12-06
  • 打赏
  • 举报
回复

这是我照你的要求给的表结构:
create table test (年份表)
(
ID int identity(1,1),
XSyear varchar(20)
)

insert into test (XSyear) values (2004)
insert into test (XSyear) values (2005)

select * from test

create table testlink (月表)
(
ID int identity(1,1),
upID int , (和年表关联)
XSMonth varchar(20)
)

insert into testlink (upID,XSMonth) values (1,'2004-01')
insert into testlink (upID,XSMonth) values (1,'2004-02')
insert into testlink (upID,XSMonth) values (1,'2004-03')
insert into testlink (upID,XSMonth) values (1,'2004-04')
insert into testlink (upID,XSMonth) values (1,'2004-05')
insert into testlink (upID,XSMonth) values (1,'2004-06')
insert into testlink (upID,XSMonth) values (1,'2004-07')
insert into testlink (upID,XSMonth) values (1,'2004-08')
insert into testlink (upID,XSMonth) values (1,'2004-09')
insert into testlink (upID,XSMonth) values (1,'2004-10')
insert into testlink (upID,XSMonth) values (1,'2004-11')
insert into testlink (upID,XSMonth) values (1,'2004-12')

insert into testlink (upID,XSMonth) values (2,'2005-01')
insert into testlink (upID,XSMonth) values (2,'2005-02')
insert into testlink (upID,XSMonth) values (2,'2005-03')
insert into testlink (upID,XSMonth) values (2,'2005-04')
insert into testlink (upID,XSMonth) values (2,'2005-05')
insert into testlink (upID,XSMonth) values (2,'2005-06')
insert into testlink (upID,XSMonth) values (2,'2005-07')
insert into testlink (upID,XSMonth) values (2,'2005-08')
insert into testlink (upID,XSMonth) values (2,'2005-09')
insert into testlink (upID,XSMonth) values (2,'2005-10')
insert into testlink (upID,XSMonth) values (2,'2005-11')
insert into testlink (upID,XSMonth) values (2,'2005-12')

select * from testlink


这是生成树的:
procedure TForm1.Button1Click(Sender: TObject);
var
Qstr,YearStr,MonthStr:String;
p:integer;
node:TTreeNode;
i:integer;
begin
Qstr:='select * from test';
with adoQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(Qstr);
Open;
First;
while not eof do
begin
YearStr:=fieldbyname('XSyear').AsString;
p:=fieldbyname('ID').AsInteger;
node:=treeview1.Items.Add(nil,YearStr);
Qstr:='select * from testlink where upID='+IntToStr(p);
with adoQuery2 do
begin
close;
SQL.Clear;
SQL.add(Qstr);
open;
First;
while not eof do
begin
MonthStr:=fieldbyname('XSMonth').AsString;
TreeView1.Items.AddChild(node,MonthStr);
Next;
end;
end;
Next;
end;
end;
end;
阿三 2005-12-06
  • 打赏
  • 举报
回复
在ado2中忘加了一个next:)
阿三 2005-12-06
  • 打赏
  • 举报
回复
帮你改了一下代码:你试一下,别用ado1.recordcount,这个严重影响速度

procedure TForm1.Button2Click(Sender: TObject);
var
node: TTreeNode;
begin
with adoq1 do
begin
close;
sql.text := 'select * from CYearMsg order by YearName';
open;
end;
while not eof do
begin
node := TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;
node.ImageIndex := ADOQ1.FieldByName('YearName').AsInteger;
with adoquery2 do
begin
close;
sql.text := ' select * from CMonthMsg order by MonthName where yearname ='+ADOQ1.FieldByName('YearName').asstring;
open;
while not eof do
begin
TreeView1.Items.AddChild(node,ADOQ2.FieldByName('MonthName').AsString+'销售额:'+ADOQ2.FieldByName('MNY').AsString);
close;
end;
end;
ADOQ1.Next;
end;


end;
suncheng_hong 2005-12-05
  • 打赏
  • 举报
回复
我给你个例子,希望对你有助:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, DB, DBClient;

type
TForm1 = class(TForm)
Panel1: TPanel;
TV: TTreeView;
Button1: TButton;
ClientDataSet1: TClientDataSet;
Edt_BH: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EDT_MC: TEdit;
EDT_SJBH: TEdit;
Button2: TButton;
procedure TVClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TMyData = ^TNodeData;
TNodeData = record
ID: Integer; //标签
BH: string; //编号
MC: string; //名称
SJBH: string; //上级编号
end;

var
Form1: TForm1;
//procedure TForm1.Button1Click(Sender: TObject);
//function KHSTR(str: string): string;

implementation

uses UDMDATA;

{$R *.dfm}

function KHSTR(str: string): string;
begin
result := '(' + str + ')';
end;

function TreeFill(FTV: Tobject; ID: Integer; TREEDSTNAMESHOW, TREEDSTNAME, TREEDSBHNAME, TREEDSMCNAME, TREEDSSJBHNAME: string): Boolean;
var
TV: TTreeView;
TopNode: TTreeNode;
TempNode: TTreeNode;
MyData: TMyData;
S: array of TMydata;
CDS_Tree: TClientDataset;
I, J, COUNT: Integer;
F: Boolean;
begin
TV := TTreeView(FTV);
TV.Items.Clear;
TV.ReadOnly := True;
TopNode := TV.Items.GetFirstNode;
New(MyData);
MyData^.ID := ID;
MyData^.BH := '';
MyData^.MC := '';
MyData^.SJBH := '';
TopNode := TV.Items.Add(TopNode, TREEDSTNAMEShow);
TopNode.ImageIndex := 0;
TopNode.SelectedIndex := 1;
TopNode.Data := MyData;
try
CDS_Tree := TClientDataset.Create(DMDATA);
CDS_Tree.ProviderName := 'DSP_AQCMD';
CDS_Tree.CommandText := ' SELECT * FROM ' + TREEDSTNAME + ' ORDER BY ' + TREEDSBHNAME;
try
CDS_Tree.Open;
COUNT := 0;
COUNT := CDS_Tree.RecordCount + 1;
if COUNT > 1 then
begin
SetLength(S, COUNT);
CDS_Tree.First;
while not CDS_Tree.Eof do
begin
New(MyData);
MyData^.ID := ID;
MyData^.BH := CDS_Tree.fieldbyname(TREEDSBHNAME).AsString; ;
MyData^.MC := CDS_Tree.fieldbyname(TREEDSMCName).AsString;
MyData^.SJBH := CDS_Tree.fieldbyname(TREEDSSJBHNAME).AsString;

if (MyData^.SJBH = null) or (MyData^.SJBH = '') or (MyData^.SJBH = '0') then
begin
//第二层
TopNode := TV.Items.GetFirstNode;
TempNode := TV.Items.AddChild(TopNode, KHStr(MyData^.BH) + MyData^.MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := MyData;
end
else
begin
//有上级
F := False;
for J := 0 to TV.Items.Count - 1 do
begin
if TMyData(TV.Items[J].data)^.BH = Mydata^.SJBH then
begin
F := True;

TopNode := TV.Items[J];
TempNode := TV.Items.AddChild(TopNode, KHStr(MyData^.BH) + MyData^.MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := MyData;

Break;
end;
end;
if not F then //找不到上级
S[CDS_Tree.RecNo] := Mydata;
end;
CDS_Tree.Next;
end;
end;
except
ShowMessage('打开表出错!');
end;
finally
CDS_Tree.Free;
end;
//处理未加入树的记录
for I := 0 to COUNT - 1 do
begin
if S[I] <> nil then
begin
F := FaLSE;
for J := 0 to TV.Items.Count - 1 do
begin
if TMyData(TV.Items[J].data)^.BH = s[i].SJBH then
begin
F := True;
TopNode := TV.Items[J];
TempNode := TV.Items.AddChild(TopNode, KHStr(s[i].BH) + s[i].MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := s[i];
Break;
end;
end;

if not F then
begin
//加入到第二层
TopNode := TV.Items.GetFirstNode;
TempNode := TV.Items.AddChild(TopNode, KHStr(s[i].BH) + s[i].MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := s[i];
end
end;
end;
TV.FullExpand;
TV.FullCollapse;
end;

procedure TForm1.TVClick(Sender: TObject);
var CZFVALUE: string;
begin
if TV.Selected <> nil then
begin
if TV.Selected.data <> nil then
begin
EDT_BH.Text := TMyData(TV.Selected.data)^.BH;
EDT_MC.Text := TMyData(TV.Selected.data)^.mc;
edt_sjbh.text := TMyData(TV.Selected.data)^.sjBH;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Treefill(TV, 0, '部门档案', 'BMDA', 'BH', 'MC', 'SJBH');
TV.FullExpand;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
EDT_BH.Text := '';
EDT_MC.Text := '';
edt_sjbh.text := '';

end;

procedure TForm1.FormShow(Sender: TObject);
const
FrmConStrA = 'Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password="%s";Data Source="%s"';
var constra: string;
begin


ConStrA := Format(FrmConStrA, ['', ExtractFilePath(Application.ExeName) + 'db1.mdb']);
with DMDATA.ADOCON do
begin
close;
ConnectionString := constra;
open;
end;
Treefill(TV, 0, '部门档案', 'BMDA', 'BH', 'MC', 'SJBH');
TV.FullExpand;

end;

end.
iranjn 2005-12-05
  • 打赏
  • 举报
回复
父节点是有了也没有错,但是往每个父节点增加子节点的时候出问题,本来应该加到2005年的都跑到2004年的了
zzq4823 2005-12-05
  • 打赏
  • 举报
回复
AddChild时要指定父节点,可在数据库中设一个字段Flag控制
if (Flag) then //父节点
TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧