ExpressDBTreeView最简单建树完整下载

链接:https://pan.baidu.com/s/1D9vbtb9akpFfcNJuF2M83Q
提取码:eomz

与 uniGUI学习之UniDBTreeGrid1从数据库建树 原理一致。


 完整例子在DevExpress VCL-21.2.4(修正)\DevExpress VCL-21.2.4\Demos\ExpressDBTree Suite\Delphi

假设数据库DataSource1已正确连接。


 01]ExpressDBTree最简单建树 设置

02]添加图标显示

03]鼠标左键点击,显示正文

04]添加同级结点

05]添加子结点

06]重命名结点

07]删除结点

08]拖放移动结点

09]多棵树 ,aParent 值小0即为新树

10]子节点的展开与收缩


 01]ExpressDBTree最简单建树 设置

表结构

DataSource DataSource1
KeyField aId
ListField aName
parentField aParent                     值小0即为新树


即可看见已经建成了树形结构

 再将WIDEMEMO显示出来

Delphi10.3的DBGrid中memo类型显示内容而不是(WIDEMEMO)(01)ForSQLite

02]添加图标显示

拖一个cxImageList1(ImageList也行)到界面上,并将dxDBTreeView1的

然后设置dxDBTreeView1的OnGetImageIndex事件为,这只是按层级设置。简单。

procedure TForm13.dxDBTreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);
begin
  Node.ImageIndex := Node.Level;
end;


复杂一点。图标下载

链接:https://pan.baidu.com/s/1dgv8enhTTTLzhDyDmbM2CQ
提取码:p6uo

procedure TForm13.dxDBTreeView1GetImageIndex(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 TForm13.dxDBTreeView1GetSelectedIndex(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;


 03]鼠标左键点击,显示正文

procedure TForm13.dxDBTreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  xyNode: TTreenode;
  aId:string;
begin
  xyNode := dxDBTreeView1.GetNodeAt(X, Y); //获得结点
  If Assigned(xyNode) Then
  Begin
     aId:=  string(dxDBTreeView1.DBTreeNodes.GetKeyFieldValue(xyNode)) ;     //获得 ID
   FDQuery2.Open('select aId,aParent,aName,aInfo  from aTable  where aId= '+ aId );
   memo1.Lines.Text:=  FDQuery2.FieldByName('aInfo').AsString ;    //将正文显示出来
//或者
  If  FDTable1.Locate('aId', aId, []) then  memo1.Lines.Text:=  FDTable1.fieldbyname('aInfo').asstring ;
If (Button
= mbLeft) Then Exit; If (Button = mbRight) Then Begin PopupMenu1.Popup(X + self.Left+dxDBTreeView1.Left+10 , Y + self.Top + dxDBTreeView1.Top+38); Exit; End; End; end;

04]添加同级结点

将事件写在 右键菜单里

procedure TForm13.N1Click(Sender: TObject);
Begin
    If ( Not (dxDBTreeView1.IsEditing))
    and  (Assigned(dxDBTreeView1.Items.Add(dxDBTreeView1.Selected, '[0]新节点'))) Then
    Begin
    if Assigned(dxDBTreeView1.Selected.Parent) then dxDBTreeView1.Selected.Parent.GetLastChild.Selected := True;

    End;
End;

05]添加子结点

将事件写在 右键菜单里

procedure TForm13.N2Click(Sender: TObject);
begin
    If ( Not (dxDBTreeView1.IsEditing))
    and  Assigned(dxDBTreeView1.Items.AddChild(dxDBTreeView1.Selected, '[0]新子节点')) Then
    Begin
      dxDBTreeView1.Selected.GetLastChild.Selected := True;
    End;
end;

06]重命名结点

直接双击结点名,也重命名。将事件写在 右键菜单里

procedure TForm13.N4Click(Sender: TObject);
Var
  InputString: String;
Begin
  If Assigned(dxDBTreeView1.Selected) Then    Begin
    InputString := dxDBTreeView1.Selected.Text;
    If InputQuery('重命名', '输入新节点名', InputString) Then       Begin
      dxDBTreeView1.Selected.Text :=  InputString;

    End;
  End;
End;

07]删除结点

dxDBTreeView1.Options的  

trDBCanDelete        能否删除
trDBConfirmDelete  是否弹出删除确定

 

直接按键盘上的Delete键,也可删除节点

将事件写在 右键菜单里

begin
If Assigned(dxDBTreeView1.Selected) And (Not dxDBTreeView1.IsEditing) Then
If Not Assigned(dxDBTreeView1.Selected.Parent) Then    // 不能 删除  根结点                               //可以
   MessageBox(Handle, PChar(dxDBTreeView1.Selected.Text                                                //注释这四行
   + ' 是根结点,会删除整个分类,所以不能被删除。'), PChar('不能删除根结点'), MB_OK + MB_ICONINFORMATION)        //  以便
   else                                                                                                //  删除根结点以外的根结点
   begin
      FDTable1.Locate('aId', dxDBTreeView1.DBTreeNodes.GetKeyFieldValue(dxDBTreeView1.Selected), []);
   If  (MessageBox(0, PwideChar('真的要删除 ' +  dxDBTreeView1.Selected.Text + ' 吗?')
, PwideChar('提示'), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDYES) Then dxDBTreeView1.Selected.Delete; end; end;

08]拖放移动结点

  08a]将dxDBTreeView1的DragMode设为dmAutomatic

  08b]将dxDBTreeView1的OnDragDropIsCopy填写代码

 

procedure TForm13.dxDBTreeView1DragDropIsCopy(Destination, Source: TTreeNode;
  var IsCopy: Boolean);
begin
 IsCopy := False;  //按Ctrl+鼠标左键 移动结点时, 不复制 结点, True为复制新建结点
end;

 


 

09]多棵树 ,aParent 值小0即为新树


10]子节点的展开与收缩

dxDBTreeView1.Items[0].Expand(false); //只展开 第一层

dxDBTreeView1.FullCollapse; // 全部 收缩
dxDBTreeView1.FullExpand; // 全部 展开