TreeView通过读数据库里的记录创建节点

原创 2006年05月18日 14:04:00

把菜单项都存在一个数据表里,这个数据表可以有无限级,通过读这个数据表来创建 Treeview 的节点
同时包括对节点的增删改


表结构

  create table HRDict( 
  id                int identity(1,1), 
          ModuleName        char(12), 
  ParentId          int 为 -1 则代表是根
  ) 

//-----------------------------------------------------


unit DictUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls,dbtables;

type
  TNodeId = record
    id : integer;
  end;
  TDictForm = class(TForm)
    Panel1: TPanel;
    TreeView1: TTreeView;
    edContent: TEdit;
    btnNewSave: TButton;
    btnModifySave: TButton;
    btnRemove: TButton;
    btnClose: TButton;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnNewSaveClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure btnModifySaveClick(Sender: TObject);
    procedure btnRemoveClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    procedure showNodes();             // 显示节点
    procedure CreateChildNode(ParentNode:TTreeNode;parentID:integer);         // 建立子节点

    procedure NewSave(isSameLevel:boolean);
    procedure ModifySave();
    procedure DeleteSave();
  public
    { Public declarations }
  end;

var
  DictForm: TDictForm;

implementation

uses DMUnit;

{$R *.dfm}

procedure TDictForm.showNodes();
var
  node:TTreeNode;
  nodeId:TNodeid;
begin
  self.TreeView1.Items.Clear;
  with DmForm.HRDictQry do
  begin
    if active then close;
    sql.Clear;
    sql.Add('select * from HRDict where parentId=-1');
    open;
    if recordcount=0 then exit;

    while not eof do
    begin
      node := treeView1.Items.Add(nil,FieldByName('moduleName').AsString);
      nodeID.id := FieldbyName('id').AsInteger;
      node.Data := Pointer(nodeid.id);
      self.CreateChildNode(node,FieldByName('id').AsInteger);
      next;
    end;
    close;

  end;
 
end;

procedure TDictForm.CreateChildNode(parentNode:TTreeNode;ParentID:integer);
var
  tempQry : TQuery;
  node:TTreeNode;
  nodeID:TNodeID;
begin
  tempQry := TQuery.Create(nil);
  tempQry.DatabaseName := DMForm.HrmsDataBase.DatabaseName;
  try
    with tempQry do
    begin
      sql.Add('select * from HRDict where parentid='+IntToStr(parentid));
      open;
      if recordcount=0 then exit;
      while not eof do
      begin
        node := self.TreeView1.Items.AddChild(parentnode,
        FieldByName('modulename').AsString);
        nodeId.id := FieldByName('id').AsInteger;
        node.Data := pointer(nodeid.id);
        self.CreateChildNode(node,FieldByName('id').AsInteger);
        next;
      end;
    end;
  finally
    tempQry.Free;
  end;
end;

procedure TDictForm.NewSave(isSameLevel:boolean);
var
 //pid:integer;        // parentId
 id :integer;
begin
  if trim(self.edContent.Text)='' then exit;

  id := integer(treeview1.Selected.Data);
  with DMform.HRDictQry do
  begin
    if isSameLevel then      // 是同一级别
    begin
      if active then close;
      sql.Clear;
      sql.Add('select parentid from HRDict where id='+IntToStr(id));
      open;
      id := Fields[0].AsInteger;
    end;
    close;
    sql.Clear;
    sql.Add('insert HRDict(moduleName,parentid)values'
    +'('''+self.edContent.Text+''','
    +inttostr(id)+')');
    execsql;
    self.showNodes;
  end;
end;

procedure TDictForm.ModifySave;
var
  id :integer;
  ss :string;
begin
  id := integer(self.TreeView1.Selected.Data);
  ss := trim(self.edContent.Text);
  if ss = '' then exit;
  with DMForm.HRDictQry do
  begin
    if active then close;
    sql.Clear;
    sql.Add('update hrdict set moduleName='''+ss+''' where id='+intTostr(id));
    execsql;
    self.showNodes;
  end;
end;

procedure TDictForm.DeleteSave;
var
  id :integer;
begin
  if messagebox(0,pchar('确认要删除吗?'),pchar('提示'),mb_yesno+mb_iconquestion)=mryes then
  begin
    id := integer(self.TreeView1.Selected.Data);
    with DMForm.HRDictQry do
    begin
      if active then close;
      sql.Clear;
      sql.Add('delete hrdict  where id='+intTostr(id)+' or parentid='+inttostr(id));
      execsql;
      self.showNodes;
    end;
  end;
end;

procedure TDictForm.FormCreate(Sender: TObject);
begin
  self.showNodes;
end;

procedure TDictForm.btnNewSaveClick(Sender: TObject);
begin
  self.NewSave(true);
end;

procedure TDictForm.Button1Click(Sender: TObject);
begin
  self.NewSave(false);
end;

procedure TDictForm.btnModifySaveClick(Sender: TObject);
begin
  self.ModifySave;
end;

procedure TDictForm.btnRemoveClick(Sender: TObject);
begin

  self.DeleteSave;
end;

procedure TDictForm.btnCloseClick(Sender: TObject);
begin
  close;
end;

end.

读取数据库 动态生成树节点

  • 2010年04月08日 15:27
  • 163KB
  • 下载

TreeView读取数据库

效果: 数据库: 思路: 利用for遍历,然后创建父节点,再根据父节点创建出子节点。 代码: 1 using System; 2 using System.Col...
  • kezhen
  • kezhen
  • 2014年03月03日 21:04
  • 1314

如何用数据库的数据动态产生TreeView

起始现在好多方法都是先生成XML,然后在生成TreeView。其实,本身创建一个动态的TreeView并不是件很复杂的事。 以下就具体说明,如何产生一个动态的树:首先,为这个树先要获取数据,如下:  ...
  • Knight94
  • Knight94
  • 2006年03月24日 18:13
  • 6069

TreeView通过读数据库里的记录创建节点

把菜单项都存在一个数据表里,这个数据表可以有无限级,通过读这个数据表来创建 Treeview 的节点同时包括对节点的增删改表结构  create table HRDict(   id         ...
  • qi_jianzhou
  • qi_jianzhou
  • 2006年05月18日 14:04
  • 1028

根据数据库结构生成TreeView

现在大多数的方法是采用递归,但这种操作会频繁的去select数据库,降低了执行效率,稍微改动一些,效果会好不少,这里介绍一种方法,即一次性select出所有数据,然后按照ParentID排序,逐条添加...
  • u010359641
  • u010359641
  • 2014年09月17日 13:12
  • 838

C# treeview 查找节点

private bool GetSubNode(TreeNodeCollection nodes, string Name, int level)         {             Li...
  • Sky_Cat
  • Sky_Cat
  • 2014年08月15日 14:40
  • 1514

TreeView点击之后保持点击节点的方法 (展开后刷新仍保持展开状态的方法)

由于微软的TreeView设计成提交式的,所以有的人写程序的时候喜欢在把node.NavigateUrl写成本页再加上一个参数(我原来也喜欢这么做),这样做的后果是一提交之后,treeView又回到原...
  • jing_xin
  • jing_xin
  • 2010年09月01日 15:48
  • 3966

treeview数据库加载节点

使用递归法. 函数如下(有些地方使用了自定义函数,自己用的时候可以修改一下): /树操作基本参数列表. Type BaseParameter ...
  • doulizheng
  • doulizheng
  • 2008年07月03日 19:52
  • 599

利用TreeView控件 从数据库中动态载入数据

//*************************  aspx  *************************//               AutoPostBack="True">   ...
  • hqt
  • hqt
  • 2005年04月18日 13:05
  • 1678

TTreeView遍历

function AllOverTreeView(node:TTreenode):TTreenode;begin    while node    begin     if node.HasChild...
  • jing12
  • jing12
  • 2007年09月11日 15:42
  • 434
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TreeView通过读数据库里的记录创建节点
举报原因:
原因补充:

(最多只允许输入30个字)