树型的严重问题,我都搞了两天了,还没搞好,头大。
看我的树型代码,树读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.