通过网盘分享的文件:TreeViewFromDB.rar
链接: https://pan.baidu.com/s/1ZJhxLBM_YQ07fpfga0hMmQ 提取码: v893

ExpressDBTreeView学习(06)

 

procedure TForm1.AddChildNodes(TreeView: TTreeView; ParentNode: TTreeNode);
var
  Query: TFDQuery;
  ChildNode: TTreeNode;
begin
  Query := TFDQuery.Create(nil);
  try
    Query.Connection := FDConnection1;
    Query.SQL.Text := 'SELECT * FROM aTable WHERE ParentID = '+ IntToStr( Integer(ParentNode.Data))+' ORDER BY ParentID';
    Query.Open;

    while not Query.Eof do
    begin
      ChildNode := TreeView.Items.AddChild(ParentNode, Query.FieldByName('Name').AsString);
      ChildNode.Data := Pointer(Query.FieldByName('ID').AsInteger);
      AddChildNodes(TreeView, ChildNode); // 递归调用   自己
      Query.Next;
    end;
  finally
    Query.Free;
  end;
end;

 

procedure TForm1.Button1Click(Sender: TObject);
var
  RootNodes: TList;
  i: Integer;
  RootNode, CurrentNode: TTreeNode;
begin
  TreeView.Items.BeginUpdate;
  try
    TreeView.Items.Clear;
      // 首先添加所有根节点
      RootNodes := TList.Create;
        FDQuery1.First;
        while not FDQuery1.Eof do
        begin
          if (FDQuery1.FieldByName('ParentID').IsNull) or
             (FDQuery1.FieldByName('ParentID').AsInteger = 0) then
          begin
            RootNode := TreeView.Items.AddChild(nil, FDQuery1.FieldByName('Name').AsString);
            RootNode.Data := Pointer(FDQuery1.FieldByName('ID').AsInteger);
            RootNodes.Add(RootNode);
          end;
          FDQuery1.Next;
        end;
        // 递归添加子节点
        for i := 0 to RootNodes.Count - 1 do
        begin
          AddChildNodes(TreeView, TTreeNode(RootNodes[i]));
        end;
        RootNodes.Free;
  finally
    TreeView.Items.EndUpdate;
  end;
 TreeView.FullExpand;
end;

 

procedure TForm1.TreeViewGetImageIndex(Sender: TObject; Node: TTreeNode);
begin
 If Node.Level = 0 Then  //根结点
    Node.IMAGEINDEX := 0
  Else If (Node.Level <> 0) And (Node.HasChildren = False) Then    //叶结点
    Node.IMAGEINDEX := 3
  Else If (Node.Level <> 0) And (Node.HasChildren) Then     // 中间结点
    Node.IMAGEINDEX := 1;
end;
procedure TForm1.TreeViewGetSelectedIndex(Sender: TObject; Node: TTreeNode);
begin
    If Node.Level = 0 Then
    Node.SelectedIndex := 0
  Else If (Node.Level <> 0) And (Node.HasChildren) Then
    Node.SelectedIndex := 1
  Else If (Node.Level <> 0) And (Node.HasChildren = False) Then
    Node.SelectedIndex := 4;
  If (Node.Level > 0) And (Node.HasChildren) Then
    Node.SelectedIndex := 2;
end;
procedure TForm1.TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  xyNode: TTreenode;
begin
  xyNode := TreeView.GetNodeAt(X, Y); //获得结点
  If Assigned(xyNode) Then showmessage(xyNode.Text); // 显示 结点 名
end;