通过数据表动态建Treeview,绝对高效率!

原创 2004年10月09日 20:48:00

/*

1。数据库表的结构:
   (
       节点ID
       节点父ID(PID)
       及其他字段
    )
   ID,PID的类型无所谓,数字,字符都行,也不需要有规律,
  只要保证ID字段为主键即可,比如可以用GUID 来作ID。
  支持无限级。

2。TTreeNode的Data指向一个结构,结构内有一个域记录节点的ID及PID,
      其他的域根据需要可自己定义。

3。从数据库生成树,这是要好好考虑的,要作到效率高,最重要的是“避免反复查询
     数据库或遍历数据集”,最好是查询一次就能生成整棵树。
    
     主要思想是:先生成一棵全是根节点的树,再做调整,这样就避免了先读出子节点,
     找不到父节点的尴尬。
*/

struct NODEDATA  //节点关联的数据
{
  int         id;
  int         pid;
  AnsiString  name;
  AnsiString  memo; //其他域省略...
};

void __fastcall FillTree()
{
  struct NODEDATA *ndata=NULL;
  TStringList     *ss=NULL;

  TTreeNode   *aNode=NULL;
  TTreeNode   *bNode=NULL;
  TTreeNode   *pNode=NULL;

  Query1->Close();
  Query1->SQL->Text="select id,pid,name,memo from tree_tab";
  Query1->SQL->Open();

  try
  {
    ss=new TStringList();
    TreeView->Items->BeginUpdate();//禁止刷新,提高速度
    //遍历记录集
    for(Query1->First(); !Query1->Eof; Query1->Next())
    {
      ndata=new NodeData();
      ndata->id   = Query1->FieldByName("id")->AsInteger;
      ndata->pid  = Query1->FieldByName("id")->AsInteger;
      ndata->name = Query1->FieldByName("name")->AsString;
      ndata->memo = Query1->FieldByName("memo")->AsString;
      //生成一个根节点加入TreeView
      aNode=TreeView1->Items->AddObject(NULL,ndata->name,ndata);
      //记录id-TreeNode对应关系,便于下面查找
      ss->AddObject(AnsiString(ndata->id),aNode);
    }
    Query1->Close();
    ndata=NULL;
    
   //下面是关键!!
 
   //调整树,根据节点的pid,把节点移到相应的TreeNode下
    int idx;
    for(aNode=TreeView1->Items->GetFirstNode(); aNode!=NULL ;)
    {
      ndata = (NODEDATA*)(aNode->Data);
      if(-1==(idx=ss->IndexOf(AnsiString(ndata->pid))))
      {
        aNode=aNode->getNextSibling();
        continue;
      }
      else
      {
        pNode = (TTreeNode*)(ss->Objects[idx]);
        bNode=aNode;
        aNode=aNode->getNextSibling();
        bNode->MoveTo(pNode,naAddChild);
      } 
    }
  }
  __finally
  {
    delete ss; ss=NULL;
    Query1->Close();
    TreeView->Items->EndUpdate();
  }
}

Python用treeview模拟表格的简单栗子

from tkinter import * from tkinter import ttk bookList=[('aaa',123),('bbb',123),('xxx',123),('sss',1...
  • peade
  • peade
  • 2016年01月02日 10:48
  • 3780

Python 窗体(tkinter)表格数据(Treeview)

import tkinter from tkinter import ttk #导入内部包 win=tkinter.Tk() tree=ttk.Treeview(win)#表格 tree["co...
  • houyanhua1
  • houyanhua1
  • 2017年10月08日 13:31
  • 1684

Asp.Net TreeView 复选框选择

//TreeView onclick 触发事件 function client_OnTreeNodeChecked(event) { //得到当前所 Click...
  • liwateryi
  • liwateryi
  • 2016年01月11日 17:14
  • 436

使用TreeView加载数据

TreeView控件在编制程序过程中用得比较多。正确的掌握和使用这个控件,可以很好的表示层次关系的数据。在数据库应用系统中,我们可以用TreeView来显示树形结构,如显示目录树、显示班级信息等等,有...
  • online
  • online
  • 2004年09月09日 00:59
  • 2630

通过数据表动态建Treeview,绝对高效率!

/*1。数据库表的结构:   (       节点ID       节点父ID(PID)       及其他字段    )   ID,PID的类型无所谓,数字,字符都行,也不需要有规律,  只要保证I...
  • luckisok
  • luckisok
  • 2007年04月05日 17:27
  • 1030

ZT:通过数据表动态建Treeview,绝对高效率!

/*1。数据库表的结构:   (       节点ID       节点父ID(PID)       及其他字段    )   ID,PID的类型无所谓,数字,字符都行,也不需要有规律,  只要保证I...
  • tingsking18
  • tingsking18
  • 2006年03月06日 10:52
  • 1181

sql

1.A_Z:所有以'A'起头,且以‘Z'结尾的字串。 2. ABC%所有ABC起头的字串 3. %AB%所有含有AB这个套式的字串。 4. Order by 栏位名【ASC,DESC】 ASC代...
  • tracyly1029
  • tracyly1029
  • 2011年12月19日 10:01
  • 219

复制表的结构,数据,主键及外键!!

 通常用  select   *   into   newTable from   oldTable就可实现数据及结构的复制,但由于主键在数据库里是唯一的,它不能把相同的主键名复制到同一数据库里支,我...
  • mzoy
  • mzoy
  • 2007年09月05日 09:33
  • 3325

动态添加treeview的节点

,动态添加treeview的节点主要控件:treeview,imagelist,button注意:treeview1.imagelist=imagelist1     Private Sub Butt...
  • keenweiwei
  • keenweiwei
  • 2008年12月25日 17:12
  • 1757

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

//*************************  aspx  *************************//               AutoPostBack="True">   ...
  • hqt
  • hqt
  • 2005年04月18日 13:05
  • 1678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过数据表动态建Treeview,绝对高效率!
举报原因:
原因补充:

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