delphi 再说TcxDBTreeList

1.当我们绑定好数据库之后,默认是全部折叠的,只显示   + 全部  

 

 

cxDBTreeList1.Root.getFirstChild.Expand(False);   //只展开第一层目录,注意除非是在create或者show事件,否则对于已经被操作过的目录,必须先折叠所有节点,才会有效
cxDBTreeList1.FullExpand;  //展开所有节点
cxDBTreeList1.FullCollapse;  //折叠所有节点
if cxDBTreeList1.FocusedNode.Level=1 then   //判断是不是子节点,1是子节点,0是父节点
cxDBTreeList1.FocusedNode.Texts[0];  //当前选择的数据,也可以直接取FDQuery或者其他数据集中取
cxDBTreeList1.FocusedNode.Parent.Texts[0];  //获取当点选中节点的父节点,如果之上还有父父父...节点呢?思考一下
cxDBTreeList1.FocusedNode.HasChildren; //判断是否存在子节点

2.列标题默认是左对齐的,如果让列标题居中显示?

 

 

 右击cxDBTreeList1-Columns,弹出列管理窗口,在caption下设置 AlignHorz  为 taCenter 即可.顺便说一下 AlignVert 是设置标题垂直方向上的对齐方式的.

 

 

 3.FindPanel,也就是搜索框.

 

 

 特点:

  1.它太丑了.还不能拓展功能.

  2.它太丑了.按钮还不能自定义.

  3.它太丑了.样式也不能自定义.

  4.基本功能它都能满足,对UI无要求的话,用它就对了

自定义搜索框:我这里只加了一个scgpEdit,其他控件你们自己按业务来加

  

大概需求如下:

 

 为了让搜索结果,显示出节点结果,我花了一个早上来想这条SQL,我SQL学得也很浅,不知道有没有更优解,如果有的话,请给我留言(我这里用的是ACCESS数据库)

procedure T新增编码.ssEditChange(Sender: TObject);
var
  isql, str: string;
begin
  with FDQCK do
  begin
    Close;
    isql := 'select * from 仓库列表 WHERE 禁用=0 ';  //默认返回全部数据
    str := UpperCase(Trim(ssEdit.Text));
    if str <> '' then   //如果有在搜索,则返回带节点结构的数据集
      isql := 'select * from 仓库列表 where 仓库名称=' + QuotedStr('全部') +    //root节点  
        ' union ' +
        'select * from 仓库列表 where 禁用= 0 and 仓库名称 like ' + QuotedStr('%' + str + '%') +  //搜索结果
        ' union ' +
        'select 仓库列表.* from( 仓库列表 RIGHT join ' +
        '(select * from 仓库列表 where 禁用= 0 and 仓库名称 like ' + QuotedStr('%' + str + '%') + ') AS A ' +  //父节点
        ' on 仓库列表.仓库ID = A.父级ID)';
    SQL.Text := isql;
    Open();
    cxDBTreeList1.FullExpand; //全部展开
  end;
end;

效果如下:

 

//获取节点目录,可以通过TcxDBTreeList的OnFocusedNodeChanged事件来实现
procedure TfraModuleSetup.cxDBTreeList1FocusedNodeChanged(Sender:
  TcxCustomTreeList; APrevFocusedNode, AFocusedNode: TcxTreeListNode);
  function ShowCxDBTreeListNodeValues(ACxDBTreeList: TcxDBTreeList): string;
  var
    S: string;
    aNode: TcxTreeListNode;
    i: Integer;
  begin
    aNode := ACxDBTreeList.FocusedNode;
    for i := aNode.Level downto 0 do
    begin
      if i = ACxDBTreeList.FocusedNode.Level then
        S := aNode.Values[0]
      else
        S := aNode.Values[0] + ' / ' + S;
      aNode := aNode.Parent;
      Result := S;
    end;
  end;

begin
  WHInfo.Caption := ShowCxDBTreeListNodeValues(cxDBTreeList1);
end;

效果如下(右上角,仓库信息):


 

posted @ 2023-03-15 15:49  一曲轻扬  阅读(810)  评论(0编辑  收藏  举报