数据库中是学生的信息,包括姓名,班级,年级,怎么让这写数据在数中显示,可按年级、班级最后学生姓名这样展开。谢谢

解决方案 »

  1.   

    给个循环添加符合要求的记录不就行了?树的顶节点为年级,第二级节点为班级,第三节点为姓名~~
    给你个简单的二级节点添加方法看看:
     ado_add:=tadoquery.Create(nil);
       ado_add.Connection:=datamodule1.ADOConnection1;
       ado_temp.SQL.Clear;
       ado_temp.SQL.Text:='select distinct 年级 from table ;
       ado_temp.Open;
       while not ado_temp.Eof do
       begin
          node:=treeview1.Items.AddChild(nil,ado_temp.fieldbyname('年级').AsString);
          begin
             ado_add.Close;
             ado_add.SQL.Text:='select distinct 班级 from table where 年级='''+ado_temp.fieldbyname('年级').AsString+'''';
             ado_add.Open;
             while not ado_add.Eof do
             begin
               treeview1.Items.AddChild(node,ado_add.fieldbyname('班级').AsString);
               ado_add.Next;
             end;
          end;
          ado_temp.Next;
       end;
      

  2.   

    一个比较简练的算法:
    procedure TForm1.Button1Click(Sender: TObject);
    const
      ID_DEPT = 2;
    var
      nLevel: Integer;
      pNodes: array[0..1023] of TTreeNode;
      lpID, lpName: string;
    begin
      ADODataSet1.Close;
      ADODataSet1.CommandText := 'SELECT * FROM [国家] ORDER BY [编号]';
      ADODataSet1.Open;
      pNodes[0] := nil;
      TreeView1.Items.Clear;
      with ADODataSet1.Recordset do
        while not Eof do
        begin
          lpID := Fields['编号'].Value;
          lpName := Fields['名称'].Value;
          nLevel := Length(lpID) div ID_DEPT;
          pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
          MoveNext;
        end;
    end;数据库示例
    编号 名称
    01 中国
    0101 吉林省
    010101 长春市
    010102 吉林市
    0102 江苏省
    010201 南京市
    010202 常州市
    02 美国
    0201 密歇根州
    020101 底特律市
    0202 华盛顿州
    020201 温哥华市
    020202 西雅图市
    03 澳大利亚
      

  3.   

    分级显示procedure TForm.FormShow(Sender: TObject);
    var
    TreeCaption :string;
    Node :TTreeNode;
    begin
      ADOQuery := TADOQuery.Create(nil);
      ADOQuery.Connection := ADOConnect;
      ADOQuery.SQL.Add(''select distinct 年级 from table  order by 年级');
      try
        ADOQuery.Open;
      except
        on E:Exception do
        begin
          ShowMessage(E.Message);
          ADOQuery.Free;
          Exit;
        end;
      end;
      Node := TreeView1.Items.Add(nil,'年级');
      while not ADOQuery.Eof do
      begin
        TreeCaption := ADOQuery.FieldByName('年级').AsString+' ';
        TreeView1.Items.AddChild(Node,TreeCaption);
        TreeView1.Refresh;
        ADOQuery.Next;
      end;
      ADOQuery.Free;
      DataTree.FullExpand;
    end;procedure TForm.TreeView1DblClick(Sender: TObject);
    var
    aCommandText,aStr,aValue :string;
    begin
    if not DataTree.Selected.HasChildren then
    begin
      ADOQuery := TADOQuery.Create(nil);
      ADOQuery.Connection := ADOConnect;
      ADOQuery.SQL.Clear;
      case TreeView1.Selected.Level of
        1:
          aCommandText := 'Select 班级 From table Where 年级=:nj '
        2:
          aCommandText := 'Select 学生姓名 From table Where 班级=:bj '
      end;
      ADOQuery.SQL.Add(aCommandText);
      aStr := Trim(TreeView.Selected.Text);
      if DataTree.Selected.Level=1 then
      begin 
        ADOQuery.Parameters.ParamByName('nj').Value := aStr;
      end;
      if DataTree.Selected.Level=2 then
      begin
        ADOQuery.Parameters.ParamByName('bj').Value := aSort;
      end;
      try
        ADOQuery.Open;
      except
        on E:Exception do
        begin
          ShowMessage(E.Message);
          ADOQuery.Free;
          Exit;
        end;
      end;
      while not ADOQuery.Eof do
      begin
          if TreeView1.Selected.Level=1 then aVaule := ADOQuery.FieldByName('班级').AsString;
          if TreeView1.Selected.Level=2 then aVaule := ADOQuery.FieldByName('学生姓名').AsString;
          TreeView1.Items.AddChild(TreeView1.Selected,aStr);
        end;
        ADOQuery.Next;
      end;
      TreeView1.Selected.Expand(True);
      ADOQuery.Free;
    end;
    end;