treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的
首先界面上添加treeview组件,然后在treeview的onchange事件里这样写:
因为要用到定义个过程,需要在接口声明里引用
private { Private declarations } ////// 刷新左侧treeView /// procedure RefreshLeftTree(Sender: TObject); public { Public declarations } end;
procedure TForm3.RefreshLeftTree(Sender: TObject);var i: Integer; node: TTreeNode; List: TStringList; s,fieldName: string;begin //刷新前全部清空原来的列表 TreeView1.Items.Clear; { 建立 List} List := TStringList.Create; List.Sorted := True; { 指定排序} List.Duplicates := dupIgnore; { 避免重复} { 把数据加入到 TreeView} for i := 0 to frmDataPool.qry需要做的事.FieldDefs.Count - 1 do begin fieldName := frmDataPool.qry需要做的事.FieldDefs[i].Name; if not 'ID说明附件事情'.Contains(fieldName) then begin node := TreeView1.Items.Add(nil, fieldName); { 字段名} { 为避免数据重复, 先把数据给 List} List.Clear; frmDataPool.qry需要做的事.First; while not frmDataPool.qry需要做的事.Eof do begin List.Add(frmDataPool.qry需要做的事.FieldByName(fieldName).AsString); frmDataPool.qry需要做的事.Next; end; { 把 List 中的数据加入到 TreeView} for s in List do begin TreeView1.Items.AddChild(node, s); end; end; end; List.Free;end;
且增加新记录后也要刷新下目录才合理
procedure TForm3.Button3Click(Sender: TObject);beginForm4.ShowModal;//showmodal可以确保这个窗口关闭后才执行下一步//增加后刷新下RefreshLeftTree(Sender);end;
onchange的触发事件代码:
procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode);begin if Node.Parent <> nil then begin { 下面的 Filter 其实就是 SQL 查询语句, 如果用其他数据库替换就是} frmDataPool.qry需要做的事.Filter := Node.Parent.Text + '=''' + Node.Text + ''''; frmDataPool.qry需要做的事.Filtered := True; end else frmDataPool.qry需要做的事.Filtered := False; { 选字段名时取消过虑}end;