数据库结构如下:
省:id,name
市:sid,sname,id
县:xid,xname,sid,id
这样,又该如何写呀?

解决方案 »

  1.   

    我看了半天我没有看是白你想干什么.如查是想加载树形结构的话你可以参照下面的这个.
    你对比一下.原理是相通的.
    我用的是分级试的.
    MENUID     NENUNAME   parents_name
    00         在职员工    NULL
    0001       生管部     在职员工
    000101     小海盗     生管部
    第一个为他的ID 第一个为节点的名称.第三个存的是他父节点的名称
    parents_name字段存放的是他父节点的名称.
    //------------------------------创建树BEGIN----------------------------------
    //调用的时候传入一个树形控件的名称
    procedure TFrm_Set_Power.CreateNavigationTree(tvThis:TTreeView);Var
     sqlstr:String;
     myQ,Child:TAdoQuery;
     sqlstr2:String;
     i:integer;
    Begin
    i:=0;
    tvThis.Items.Clear();
    myQ:=TadoQuery.Create(self);
    myQ.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;
    myQ.Close();
    myQ.SQL.Clear();        sqlstr  := 'Select menuid,MenuName menuname,MenuUrl menuurl,SetParameters menuparam From T_SysMenuInfo menu';
            sqlstr:= sqlstr+' where parents_name=' ;
            sqlstr:= sqlstr+'''''';
            sqlstr:= sqlstr+' Order By MenuId' ; myQ.Close();
     myQ.SQL.Clear();
     myQ.SQL.Add(sqlstr);
     myQ.Open();
     myQ.First();
     While not myQ.Eof do
      Begin
       tvThis.Items.Add(tvThis.Selected,myQ.FieldByName('menuname').AsString);
         begin
           Child:=tAdoQuery.Create(Self);
           Child.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=WORK;Data Source=sbsever';              sqlstr2:='Select menuid,MenuName menuname,MenuUrl menuurl,SetParameters menuparam From T_SysMenuInfo menu';
                  sqlstr2:= sqlstr2+' where parents_name=' ;
                  sqlstr2:= sqlstr2+''''+myQ.FieldByName('menuname').AsString+'''';
                  sqlstr2:= sqlstr2+' Order By MenuId' ;
           
         Child.Close();
         Child.SQL.Clear();
         Child.SQL.Add(sqlstr2);
         Child.Open();
         Child.First();
        for i:=i to tvThis.Items.Count-1  do
             if  tvThis.items.Item[i].Text=myQ.FieldByName('menuname').AsString then
          begin
           While not Child.Eof do
           Begin
             tvThis.Items.AddChild(tvThis.items.Item[i],Child.FieldByName('menuname').AsString);
             Child.Next;
           End;
           Child.Free;
           break;
         END;
      end;
       i:=i+1;
     myQ.Next;
     End;
     myQ.Free();
     sqlstr:='';
     sqlstr2:='';
    End;
    //-------创建树END-----
      

  2.   

    谢谢 loon1981(懒家伙)
    分先记着,呵呵~~~~~~~~~
    对不起~没写明白~抱歉~~~~~
    是ComboBox控件选择框的动态载入~~~~~~~
      

  3.   

    还是没有明白.
    你想实现.我先择一个省的时候比如四川的时候
    在COMBOBOX里就出现成都城市的名字吗?
    是只有一个COMBOBOX还是
    省,市,县各用一个COMBOBOX?
      

  4.   

    回答 loon1981(懒家伙),
    1,先择一个省的时候比如四川的时候
    在COMBOBOX里就出现成都城市的名字
    2,省,市,县各用一个COMBOBOX?
      

  5.   

    在combobox的OnChange事件里做处理。
    比如3个combobox(代称为:省、市、县)你把市和县设置为enable:= false;这时只能选择省。
    然后在省的onchange事件里访问数据库,将返回结果加入‘市’里,同时市的enable:= true;同理.............
      

  6.   

    楼主是不是想要这种效果啊!代码如下//大类、小类、编号(大类的前3位,小类的前5位,后面几位随意)
    //获取大类编号
    procedure Tform1.FormCreate(Sender: TObject);
    var str,s:string;
    begin
    str:='select * from esprodmainclss order by 大类编号';//esprodmainclss大类表
    begin
    ADOquery0.close;
    ADOquery0.sql.clear;
    ADOquery0.SQL.add(str);
    ADOquery0.open;
    end;
    ComboBox1.Items.Clear;
    ADOquery0.First;
    while not ADOquery0.EOF do
    begin
    s:=ADOQuery0.Fields[0].AsString;
    s:=s+''+ADOQuery0.Fields[1].AsString;
    ComboBox1.Items.Add(s);
    ADOQuery0.Next;
    end;
    combobox1.itemindex:=0;
    end;
    //获取小类
    procedure Tform1.ComboBox1Change(Sender: TObject);
    var str,s:string;
    begin
    str:='select * from esprodsubclss where 大类编号=''';//esprodsubclss小类表
    str:=str+copy(combobox1.Text,1,3)+'''';
    str:=str+' order by 小类编号';
    begin
    ADOQuery0.close;
    ADOQuery0.sql.clear;
    ADOQuery0.SQL.add(str);
    ADOQuery0.open;
    end;
    ComboBox2.Items.Clear;
    ADOQuery0.First;
    while not ADOQuery0.EOF do
    begin
    s:=ADOQuery0.Fields[0].AsString;
    s:=s+' '+ADOQuery0.Fields[1].AsString;
    ComboBox2.Items.Add(s);
    ADOQuery0.Next;
    end;
      combobox2.itemindex:=0;
    end;
    //获取编号
    procedure Tform1.ComboBox2Change(Sender: TObject);
    var str,s:string;
    begin
    str:='select * from esprodclss where 大类编号=''';//esprodclss编号表
    str:=str+copy(combobox1.Text,1,3)+'''';
    str:=str+' and  小类编号=''';
    str:=str+copy(combobox2.Text,1,5)+'''';
    str:=str+' order by 资产编号';begin
    ADOQuery0.close;
    ADOQuery0.sql.clear;
    ADOQuery0.SQL.add(str);
    ADOQuery0.open;
    end;
    ComboBox3.Items.Clear;
    ADOQuery0.First;
    while not ADOQuery0.EOF do
    begin
    s:=ADOQuery0.Fields[0].AsString;
    s:=s+' '+ADOQuery0.Fields[1].AsString;
    ComboBox3.Items.Add(s);
    ADOQuery0.Next;
    end;
       combobox3.itemindex:=0;
    end;
      

  7.   

    在省的COMBOBOX里面的CHANGE事件写动态加载属于当前省的市数据,再在市的COMBOBOX的CHANGE事件写动态加载属于当前市的县数据