行政编制编码按省、市、县三级。代码长度为6位。省级后四位为0000,市级后两位为00。但对于直辖市特殊,一部分县直接归省级管辖。表内容如下: 名称          代码      级别  
北京市院       110000     2
海淀区院       110101     4
朝阳区院       110102     4
... ...
... ...
北京铁路局院   110200     3
铁路一院       110201     4
铁路二院       110202     4
... ...
河北省院        130000     2
石家庄院        130100     3
桥东区院        130101     4
桥西区院        130102     4
唐山市院        130200     3
路南区院        130201     4
... ...现在需要根据上述结构,用treeview来分层显示,编辑。效果如下: 北京市院
----海淀区院
----朝阳区院
----北京铁路局院
--------铁路一院
--------铁路二院
河北省院
----石家庄院
--------桥东区院 
--------桥西区院 
----唐山市院
--------路南区院
我苦苦做了一天也没做出来,不得已请教各位老师,我怀疑我的脑袋被尼古丁已经熏坏了。部门经理已经用异样眼光注视我。哎!

解决方案 »

  1.   

    首先要进行数据排序,上级内容必须在前。这样就可以保证在添加一条记录时不会存在找不到上级目录的问题。然后就可以按序添加了,在添加子级数据时,计算出它的上级代码,找到上级代码并AddChildObject就可以了。主要是要注意在TreeView里面保存下代码,方法就是AddObject(名称,TObject(代码));读进就Integer(Data)就可以了。不明白你到低什么地方不清楚,可以联系。[email protected]
      

  2.   

    我给你回信,但我信息总是退信,不知为何,解决没有啊。
    如没有我这里给你代码。两种方法都可以。
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i, j, id, id2, iCount : Integer;
      sName: string;
      node: TTreeNode;
    begin
      TreeView1.Items.Clear;
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := 'Select Max(jj) from jydm';
      ADOQuery1.Open;
      iCount := ADOQuery1.Fields[0].AsInteger;
      ADOQuery1.Close;
      for i := 1 to iCount do
      begin
        ADOQuery1.SQL.Text := Format('Select * from jydm where jj = %d order by jydm',[i]);
        ADOQuery1.Open;
        while not ADOQuery1.Eof do
        begin
          id :=ADOQuery1.FieldByName('jydm').AsInteger;
          sName := ADOQuery1.FieldByName('jymc').AsString;
          if i = 1 then TreeView1.Items.AddObject(nil,sName,TObject(id))
          else begin
            id2 := id div 100 * 100;
            node := nil;
            for j := 0 to TreeView1.Items.Count - 1 do
              if Integer(TreeView1.Items[j].Data) = id2 then
              begin
              node := TreeView1.Items[j];
              break;
              end;
            TreeView1.Items.AddChildObject(node,sName,TObject(id));
          end;
          ADOQuery1.Next;
        end;
        ADOQuery1.Close;
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      i, j, id, id2, iCount : Integer;
      sName: string;
      node: TTreeNode;
    begin
      TreeView1.Items.Clear;
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := 'Select Max(jj) from jydm';
      ADOQuery1.Open;
      iCount := ADOQuery1.Fields[0].AsInteger;
      ADOQuery1.Close;
      for i := 1 to iCount do
      begin
        ADOQuery1.SQL.Text := Format('Select * from jydm where jj = %d order by jydm',[i]);
        ADOQuery1.Open;
        while not ADOQuery1.Eof do
        begin
          id :=ADOQuery1.FieldByName('jydm').AsInteger;
          sName := ADOQuery1.FieldByName('jymc').AsString;
          if i = 1 then TreeView1.Items.Add(nil,sName).StateIndex := id
          else begin
            id2 := id div 100 * 100;
            node := nil;
            for j := 0 to TreeView1.Items.Count - 1 do
              if TreeView1.Items[j].StateIndex = id2 then
              begin
              node := TreeView1.Items[j];
              break;
              end;
            TreeView1.Items.AddChild(node,sName).StateIndex := id;
          end;
          ADOQuery1.Next;
        end;
        ADOQuery1.Close;
      end;
    end;