链接:https://pan.baidu.com/s/1D9vbtb9akpFfcNJuF2M83Q
提取码:eomz
与 uniGUI学习之UniDBTreeGrid1从数据库建树 原理一致。
完整例子在DevExpress VCL-21.2.4(修正)\DevExpress VCL-21.2.4\Demos\ExpressDBTree Suite\Delphi
假设数据库DataSource1已正确连接。
表结构
DataSource
DataSource1KeyField
aIdListField
aNameparentField
aParent 值小0即为新树
即可看见已经建成了树形结构
再将WIDEMEMO显示出来
Delphi10.3的DBGrid中memo类型显示内容而不是(WIDEMEMO)(01)ForSQLite
拖一个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;
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;
将事件写在 右键菜单里
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;
将事件写在 右键菜单里
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;
直接双击结点名
,也重命名。将事件写在 右键菜单里
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;
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;
08a]将dxDBTreeView1的DragMode设为dmAutomatic
08b]将dxDBTreeView1的OnDragDropIsCopy填写代码
procedure TForm13.dxDBTreeView1DragDropIsCopy(Destination, Source: TTreeNode; var IsCopy: Boolean); begin IsCopy := False; //按Ctrl+鼠标左键 移动结点时, 不复制 结点, True为复制新建结点 end;
dxDBTreeView1.Items[0].Expand(false); //只展开 第一层
dxDBTreeView1.FullCollapse; // 全部 收缩
dxDBTreeView1.FullExpand; // 全部 展开