unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DB, DBTables, ComCtrls, Grids, DBGrids, ExtCtrls,
  DBCtrls, Mask, ImgList;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    ImageList1: TImageList;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    Label1: TLabel;
    Label2: TLabel;
    DBEdit2: TDBEdit;
    Table1: TTable;
    Label3: TLabel;
    DBNavigator1: TDBNavigator;
    Label4: TLabel;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;

procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure DataSource1StateChange(Sender: TObject);
    procedure Table1AfterInsert(DataSet: TDataSet);
    procedure Table1BeforeDelete(DataSet: TDataSet);
    procedure Table1BeforeEdit(DataSet: TDataSet);
    procedure Table1AfterDelete(DataSet: TDataSet);
    procedure Table1AfterPost(DataSet: TDataSet);
  private
    function  GetFieldList: TStringList;
    { Private-Declarationen }
  public
    { Public-Declarationen }
  end;

var
  Form1: TForm1;
  FieldList: TStringList;

implementation
uses TreeFunc;

{$R *.DFM}

function TForm1.GetFieldList: TStringList;
begin
     FieldList.clear;
     FieldList.add(Table1.fieldbyname(Country).asstring);
     FieldList.add(Table1.fieldbyname(city).asstring);
     FieldList.add(Table1.fieldbyname(Company).asstring);
     Result := FieldList;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     FieldList := TStringList.create;
     TreeView1.items.BeginUpdate;//forbid treeview update
     Table1.first;
     while not Table1.eof do
       begin
          TreeAddItem(TreeView1, GetFieldList, Table1.getBookmark, false);//生成结点
          Table1.next;
       end;
     FieldList.clear;
     TreeView1.Alphasort;
     TreeView1.items.Endupdate;

//make first record selected:
     TreeView1.items[2].selected := true;
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
     Datasource1.enabled := Node.data <> nil;
     if DataSource1.enabled then Table1.Gotobookmark(node.data);
end;

procedure TForm1.DataSource1StateChange(Sender: TObject);
var
   ItemList: TStringList;
   Node: TTreeNode;
begin
end;

procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
     FieldList.clear;
end;

procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
     GetFieldList;
end;

procedure TForm1.Table1BeforeEdit(DataSet: TDataSet);
begin
     GetFieldList;
end;

procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
var
   CascadeDeleteLevel: Integer;
begin
     CascadeDeleteLevel := 0;
     TreeDeleteItem(TreeView1, FieldList, CascadeDeleteLevel);
end;

procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
     TreeView1.items.beginUpdate;

if FieldList.count > 0 then TreeDeleteItem(TreeView1, Fieldlist, 0);
     TreeView1.selected := TreeAddItem(TreeView1, GetFieldlist, Table1.getbookmark, True);

TreeView1.items.endUpdate;
end;

end.
///————————
unit TreeFunc;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, ComCtrls, DB, Forms, Dialogs;

function  TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
function  TreeAddItem(Sender: TTreeView; ItemList: TStrings; Bookmark: TBookmark; Resort: Boolean): TTreeNode;
function  TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode;
procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer);

implementation

function TreeAddItem(Sender: TTreeView; ItemList: TStrings; Bookmark: TBookmark; Resort: Boolean): TTreeNode;
var
   ThisNode, Node: TTreeNode;
   I: Integer;
begin
     Node := nil;   //nil = level 0 has no parent node
                    //this is checked by TreeFindItem
     for I := 0 to Itemlist.count -1 do
        begin //for
          ThisNode := TreeFindItem(Sender, node, Itemlist[i]);
          if ThisNode <> nil then
            Node := ThisNode
          else
            begin
               if I < Itemlist.count -1 then
                 begin
                    if I = 0 then
                      Node := Sender.items.Add(Node, Itemlist[i])
                    else
                      Node := Sender.items.AddChild(Node, Itemlist[i]);
                 end
               else
                 begin
                    if I = 0 then
                      Node := Sender.items.AddObject(Node, Itemlist[i], Bookmark)
                    else
                      Node := Sender.items.AddChildObject(Node, Itemlist[i], Bookmark);
                 end;
               Node.stateIndex := Node.level + 1;
               if Resort and (Node.parent <> nil) then Node.parent.alphasort;
            end;
        end; //for
     Result := Node;
end;

function TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
begin
     if NodeItem = nil then NodeItem := Sender.items.getfirstnode
     else NodeItem := NodeItem.getfirstchild;
//NodeItem is now the first item of the desired level
//if this level has no items, NodeItem is nil

if (NodeItem <> nil) and (NodeItem.text <> Name) then
     repeat
           NodeItem := NodeItem.getnextsibling;
     until (NodeItem = nil) or (NodeItem.text = Name);
     Result := NodeItem;
end;

function TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode;
begin
     Result := TreeAddItem(Sender, Itemlist, nil, false);
end;

procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer);
var
   Node, Parent: TTreeNode;
begin
     Node := TreeGetItem(Sender, ItemList);
     while Node.level >= Level do
     begin
          Parent := Node.parent;
          Node.delete;
          if (Parent = nil) or (Parent.hasChildren) then break;
          Node := Parent;
     end;
end;

end.

我的dbtreeview–treeview直接连接数据表_delphi教程的更多相关文章

  1. access treeview读取数据表成树并与子窗体联动

    Private Sub Form_Load()Dim i As IntegerDim rst As DAO.RecordsetSet rst = CurrentDb.OpenRecordset(&qu ...

  2. Winfrom treeview 如何从多个数据表中获取数据动态生成

    本文转载:http://www.cnblogs.com/VincentLuo/archive/2008/03/29/1128987.html 在 汪洋怡舟的这篇文章中[http://www.cnblo ...

  3. treeview自动从表中添加标题和列值做目录的方法2

    treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的 http://www.cnblogs.com/del/archive/2008/05/15/1114450.html 首 ...

  4. CRL快速开发框架系列教程一(Code First数据表不需再关心)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. C#向sql server数据表添加数据源代码

    HoverTree解决方案 学习C#.NET,Sql Server,WinForm等的解决方案. 本文链接http://hovertree.com/h/bjaf/0jteg8cv.htm 使用的技术. ...

  6. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  7. excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)

    将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...

  8. MySQL数据表range分区例子

    某些行业数据量的增长速度极快,随着数据库中数据量的急速膨胀,数据库的插入和查询效率越来越低.此时,除了程序代码和查询语句外,还得在数据库的结构上做点更改:在一个主读辅写的数据库中,当数据表数据超过10 ...

  9. 删除Mysql数据表中多余的重复记录的sql语句

    数据表 sniper_tb 中存在主键 id,字段url,现需要在url字段上添加 unique,但由于url存在重复记录,导致添加失败. 如何删除表中多余的url重复记录,仅保持一条? 思路一 将 ...

随机推荐

  1. API接口文档中将Swagger文档转Word 文档

    一般的开发工作,尤其是API接口的开发工作,首先要有开发文档,接口说明文档 ok,后来开发完毕了 和页面联调,或者是和第三方联调的时候, 这个时候,SA systeam admin 就会开始直接让开发 ...

  2. 深入理解Kubernetes资源限制:CPU

    写在前面 在上一篇关于Kubernetes资源限制的文章我们讨论了如何通过ResourceRequirements设置Pod中容器内存限制,以及容器运行时是如何利用Linux Cgroups实现这些限 ...

  3. Java&Selenium智能等待方法封装

    Java&Selenium智能等待方法封装 ExpectedConditions方法还有很多,自然也可以继续扩展很多 package util; import org.openqa.selen ...

  4. Python基础之While循环

    一.摘要 本片博文将介绍input()函数和while循环的使用 二.input()函数 函数input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以 ...

  5. 解决python中调用 imread 报错:ImportError: cannot import name imread

    安装了scipy后,报cannot import name imread错误, 1.网上查阅资料后说是需要安装pillow,安装pillow之后,仍然报该错误, 2.网上说是pillow与SciPy安 ...

  6. 小白学Python | 最简单的Django 简明教程

    作者:浅雨凉 来源:http://www.cnblogs.com/qianyuliang/p/6814376.html 一.Django简介 1. web框架介绍 具体介绍Django之前,必须先介绍 ...

  7. JDK源码那些事儿之红黑树基础上篇

    说到HashMap,就一定要说到红黑树,红黑树作为一种自平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能,今天就来说一说红黑树. 前言 限于篇幅,本文只对红 ...

  8. Java锁--框架

    根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源 ...

  9. CentOS7.x安装Wiki.js知识库

    近期有个需求,搭建一个知识管理系统,所以就找了几个可作为知识管理的软件,最终定位到wiki.js,之所以选择这个,是看中了它的易部署性,该项目是在2016年12月推出了第一个版本,算是比较新的项目了, ...

  10. 检测 gcc 是否支持 C99 标准的方法

    一般来说 gcc 3.0 以上都是支持 C99 的 但是编译的时候得加上 -std=c99 检测 gcc 是否支持 C99 方法,新建 c99.c 文件,内容如下 #include <stdio ...