树型的严重问题,我都搞了两天了,还没搞好,头大。
看我的树型代码,树读Tree表,Tree表有三个字段,AutoId,FatherId,分类名。
AutoId为自动编号,FatherId为父节点,分类名是节点的内容,节点内容显示是Tree表中的“分类名”字段数字类型,换文本型后显示事件提示“标准表达式中数据类型不同”错误。
新增节点固定为数字型才能读数据,qry1读ClassInfo表,而我的qry1对应的是DBGrid,我想通过qry1中“分类名”字段记录与树节点的“分类名”字段记录对应。现在的问题是我怎么让树节点与我的DBGrid通过两个表(ClassInfo表和Tree表)的“分类名”字段将数据对应起来?目前代码只能把ACCESS数据库中的分类名变为数字型才能对应。但我想的是文本型。
另外对应起来后,我把节点重命名,原先的数据分类名又和节点对不上了。头疼,我的目的就是想实现动态树与DBGrid中的记录通过两张表都有的“分类名”字段来对应起来亚!我都急了两天了,可就是急不出来。我想哭!
我今天一大早就爬起来上大富翁发帖求救了,都快急死了,我。procedure Tmainform.AddClass(AId: integer;FatherNode:TTreeNode); //创建树
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from Tree');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('分类名').AsString);
//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;
AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;procedure Tmainform.AddDataToDB(CurrNode,FatherNode: TTreeNode); //存入ACCESS数据库中的Tree表
var
myLabel:TLabel;
QryTmp:TADOQuery;
AId:integer;
begin
if not assigned(FatherNode) then
AId:=0
else if not assigned(FatherNode.Data) then
AId:=0
else
AId:=strtoint(TLabel(FatherNode.Data).caption);
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from Tree');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
QryTmp.Append;
QryTmp['FatherId']:=AId;
QryTmp['分类名']:=CurrNode.Text;
QryTmp.Post; //创建记录currNode的AutoId表识标
myLabel:=TLabel.Create(self);
myLabel.Visible:=False;
MyLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
CurrNode.Data:=myLabel;
QryTmp.Free;
end;procedure Tmainform.N8Click(Sender: TObject); //增加同级节点
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('同级分类','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.Add(treeview1.Selected,strName);
if assigned(treeview1.Selected) then
AddDataToDB(myNode,treeview1.Selected.Parent)
else
AddDataToDB(myNode,nil);
myNode.selected:=true;
end;procedure Tmainform.N9Click(Sender: TObject); //增加子级节点
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('子分类','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.AddChild(treeview1.Selected,strName);
AddDataToDB(myNode,treeview1.Selected);
myNode.selected:=true;
end;procedure Tmainform.N12Click(Sender: TObject); //节点重命名,这里命名了DBGrid中的原先对它对应的数据又对不上了
var
QryTmp:TADOQuery;
strName:string;
begin
if not assigned(treeview1.Selected) then
exit;
strName:=inputbox('修改','请输入新的名称: ','');
strName:=trim(strName);
if strName='' then
exit;
//删除下级别分类
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('update Tree set 分类名='+''''+strName+'''');
QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
QryTmp.ExecSQL;
Treeview1.Selected.Text:=strName;
end;procedure Tmainform.TreeView1Change(Sender: TObject; Node: TTreeNode);//DBGrid连ClassInfo表,通过得到树节点的text与DBGrid中的“分类名”字段相匹配
begin
with DM.DataModule2.qry1 do
begin
SQL.Clear;
sql.add('select A.* from ClassInfo A inner join Tree B on A.分类名=B.分类名');
sql.add('where A.分类名='+treeview1.Selected.Text);
Open;
end;
end;
end.
看我的树型代码,树读Tree表,Tree表有三个字段,AutoId,FatherId,分类名。
AutoId为自动编号,FatherId为父节点,分类名是节点的内容,节点内容显示是Tree表中的“分类名”字段数字类型,换文本型后显示事件提示“标准表达式中数据类型不同”错误。
新增节点固定为数字型才能读数据,qry1读ClassInfo表,而我的qry1对应的是DBGrid,我想通过qry1中“分类名”字段记录与树节点的“分类名”字段记录对应。现在的问题是我怎么让树节点与我的DBGrid通过两个表(ClassInfo表和Tree表)的“分类名”字段将数据对应起来?目前代码只能把ACCESS数据库中的分类名变为数字型才能对应。但我想的是文本型。
另外对应起来后,我把节点重命名,原先的数据分类名又和节点对不上了。头疼,我的目的就是想实现动态树与DBGrid中的记录通过两张表都有的“分类名”字段来对应起来亚!我都急了两天了,可就是急不出来。我想哭!
我今天一大早就爬起来上大富翁发帖求救了,都快急死了,我。procedure Tmainform.AddClass(AId: integer;FatherNode:TTreeNode); //创建树
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from Tree');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('分类名').AsString);
//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;
AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;procedure Tmainform.AddDataToDB(CurrNode,FatherNode: TTreeNode); //存入ACCESS数据库中的Tree表
var
myLabel:TLabel;
QryTmp:TADOQuery;
AId:integer;
begin
if not assigned(FatherNode) then
AId:=0
else if not assigned(FatherNode.Data) then
AId:=0
else
AId:=strtoint(TLabel(FatherNode.Data).caption);
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from Tree');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
QryTmp.Append;
QryTmp['FatherId']:=AId;
QryTmp['分类名']:=CurrNode.Text;
QryTmp.Post; //创建记录currNode的AutoId表识标
myLabel:=TLabel.Create(self);
myLabel.Visible:=False;
MyLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
CurrNode.Data:=myLabel;
QryTmp.Free;
end;procedure Tmainform.N8Click(Sender: TObject); //增加同级节点
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('同级分类','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.Add(treeview1.Selected,strName);
if assigned(treeview1.Selected) then
AddDataToDB(myNode,treeview1.Selected.Parent)
else
AddDataToDB(myNode,nil);
myNode.selected:=true;
end;procedure Tmainform.N9Click(Sender: TObject); //增加子级节点
var
strName:string;
myNode:TTreeNode;
begin
strName:=inputbox('子分类','请输入分类名称: ','');
strName:=trim(strName);
if strName='' then
exit;
myNode:=treeview1.Items.AddChild(treeview1.Selected,strName);
AddDataToDB(myNode,treeview1.Selected);
myNode.selected:=true;
end;procedure Tmainform.N12Click(Sender: TObject); //节点重命名,这里命名了DBGrid中的原先对它对应的数据又对不上了
var
QryTmp:TADOQuery;
strName:string;
begin
if not assigned(treeview1.Selected) then
exit;
strName:=inputbox('修改','请输入新的名称: ','');
strName:=trim(strName);
if strName='' then
exit;
//删除下级别分类
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'ClassInfo.mdb;Persist Security Info=False';
QryTmp.SQL.Add('update Tree set 分类名='+''''+strName+'''');
QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
QryTmp.ExecSQL;
Treeview1.Selected.Text:=strName;
end;procedure Tmainform.TreeView1Change(Sender: TObject; Node: TTreeNode);//DBGrid连ClassInfo表,通过得到树节点的text与DBGrid中的“分类名”字段相匹配
begin
with DM.DataModule2.qry1 do
begin
SQL.Clear;
sql.add('select A.* from ClassInfo A inner join Tree B on A.分类名=B.分类名');
sql.add('where A.分类名='+treeview1.Selected.Text);
Open;
end;
end;
end.
解决方案 »
- B编码以及BT种子解析Delphi版
- 关于在别的exe中追加代码的问题
- Delphi 2011中undo的疑问
- 客户端不采用数据控件,只有TClientSocket,服务器端如何将数据库的一个表的内容通过TServerSocket传送到客户端?
- 问一个关于用ADO连接SQL SEVRE 2000的问题
- SQL游标的问题,辕马见内
- ClientDataSet数据导入问题
- 请教高手:我用delphi5 的EXECL控件打开execl,生成一个execl表弹,往里面输入数据,操作完后,直接点击EXECl界面的退出按钮,回到我自己
- 问一个很弱的问题。在线急等。
- 怎样将一个数字如“1997”转换为“一九九七”?
- 问个新手问题!!
- ADOQUERY怎么设置主从表?
type
TMyRec = record
name1: string;
name2: string;
type1: Integer;
.....//可以放很多数据的
end;