求教关于树 TreeView1 控件的用法,多谢指教!

NEEZA哪吒 2025-06-12 22:16:50

 

表1  AREA

AREAIDAREANAME
1001黑龙江
1002辽宁
1003吉林

 

表2 CITY

CITYIDAREAIDCITYNAME
20011001哈尔滨
20021001大兴安岭
20031002沈阳

以下代码可以查询出地区的数据,

procedure TMain.Button1Click(Sender: TObject);
var
  RootNode : TTreeNode;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM AREA');
  ADOQuery1.Open;
  RootNode:=TreeView1.Items.GetFirstNode();
  RootNode.DeleteChildren;
  while NOT ADOQuery1.EOF do
  Begin
    TreeView1.Items.AddChild(RootNode,ADOQuery1.FieldByName('AREANAME').AsString) ;
    ADOQuery1.Next;
    End;
 RootNode.Expand(false);

 

如何查询下一级数据,就是哈尔滨、大兴安岭这级别?

...全文
成就一亿技术人!
拼手气红包 10.00元
106274 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

10.6W+?太夸张了吧,哈哈哈

img

  • 打赏
  • 举报
回复

这是DS给的结果,我没有测试,你可以试一下:

procedure TMain.Button1Click(Sender: TObject);
var
  RootNode, AreaNode: TTreeNode;
  AreaID: Integer;
  CityQuery: TADOQuery; // 用于查询城市的临时查询对象
begin
  // 清除TreeView现有内容
  RootNode := TreeView1.Items.GetFirstNode();
  RootNode.DeleteChildren;
  
  // 查询地区数据
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM AREA');
  ADOQuery1.Open;
  
  // 创建临时查询对象用于查询城市
  CityQuery := TADOQuery.Create(nil);
  try
    CityQuery.Connection := ADOQuery1.Connection; // 使用相同的数据库连接
    
    // 遍历地区数据
    while not ADOQuery1.EOF do
    begin
      AreaID := ADOQuery1.FieldByName('AREAID').AsInteger;
      
      // 添加地区节点
      AreaNode := TreeView1.Items.AddChild(RootNode, ADOQuery1.FieldByName('AREANAME').AsString);
      
      // 查询该地区下的城市
      CityQuery.Close;
      CityQuery.SQL.Clear;
      CityQuery.SQL.Add('SELECT * FROM CITY WHERE AREAID = :AreaID');
      CityQuery.Parameters.ParamByName('AreaID').Value := AreaID;
      CityQuery.Open;
      
      // 添加城市子节点
      while not CityQuery.EOF do
      begin
        TreeView1.Items.AddChild(AreaNode, CityQuery.FieldByName('CITYNAME').AsString);
        CityQuery.Next;
      end;
      
      ADOQuery1.Next;
    end;
  finally
    CityQuery.Free; // 释放临时查询对象
  end;
  
  RootNode.Expand(False);
end;

  • 打赏
  • 举报
回复

img

soso1968 06-13
  • 打赏
  • 举报
回复 1

要在 TreeView1 中查询并显示下一级城市数据(如哈尔滨、大兴安岭),您需要修改代码,在添加地区节点后,进一步查询对应的城市数据并作为子节点添加。以下是实现代码:

procedure TMain.Button1Click(Sender: TObject);
var
  RootNode, AreaNode: TTreeNode;
begin
  // 清空树视图
  RootNode := TreeView1.Items.GetFirstNode();
  RootNode.DeleteChildren;

  // 查询地区数据
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM AREA');
  ADOQuery1.Open;

  // 遍历地区数据
  while not ADOQuery1.EOF do
  begin
    // 添加地区节点
    AreaNode := TreeView1.Items.AddChild(RootNode, ADOQuery1.FieldByName('AREANAME').AsString);
    
    // 查询当前地区对应的城市数据
    ADOQuery2.Close;
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Add('SELECT * FROM CITY WHERE AREAID = :AreaID');
    ADOQuery2.Parameters.ParamByName('AreaID').Value := ADOQuery1.FieldByName('AREAID').AsString;
    ADOQuery2.Open;

    // 遍历城市数据并添加为地区节点的子节点
    while not ADOQuery2.EOF do
    begin
      TreeView1.Items.AddChild(AreaNode, ADOQuery2.FieldByName('CITYNAME').AsString);
      ADOQuery2.Next;
    end;

    ADOQuery1.Next;
  end;

  // 展开所有节点
  RootNode.Expand(True);
end;

关键点说明:

  1. 使用了两个 ADOQuery 组件:

    • ADOQuery1 用于查询地区数据
    • ADOQuery2 用于查询对应地区的城市数据
  2. 节点层级关系:

    • RootNode 是根节点
    • AreaNode 是地区节点(如黑龙江、辽宁)
    • 城市节点(如哈尔滨、沈阳)作为 AreaNode 的子节点添加
  3. 参数化查询:

    • 城市查询使用参数 :AreaID 来确保只查询当前地区的城市

注意事项:

  • 确保 ADOQuery2 组件已正确配置数据库连接
  • 如果只有一个 ADOQuery 组件,可以在查询城市数据前先关闭并重新设置 ADOQuery1
  • 可以添加错误处理(try...except)来提高代码健壮性

这样,您就能在 TreeView 中看到层级结构:根节点展开后显示所有地区,每个地区节点展开后显示该地区下的所有城市。

  • 举报
回复
@soso1968 有个错误呢
tanqth 06-14
  • 举报
回复
@NEEZA哪吒 他这个,看上去是问的AI,有错误是正常的。
tanqth 06-14
  • 举报
回复 1
@NEEZA哪吒 不过,大致看上去思路是正确的。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧