编程思想:
每条记录代表一个节点。通过表里的 2 个数字型的核心字段 f_nodeid、f_parentnodeid 形成逻辑上的层次型关系。约定 0 代表根节点。其他字段为辅助字段,与本文关系不大。
定义和初始化一对象数组 mynodes,然后一次性读取表中的记录,通过判断当前节点的父节点,依次建立所有的上下级关系。
示例数据:
运行结果:
示例下载:http://www.why100000.com/_ftps/samples/tree+db.rar
(代码调试环境:visual web developer 2005 express edition)
access数据库名:db_system.mdb
表名:tabitems
表结构:
f_i_autoid 自动编号
f_nodeid 数字(本节点id)
f_parentnodeid 数字(父节点id)
f_name 文本
f_tag 文本
f_url 文本
f_order 数字
f_ishidden 文本
f_datetime 日期/时间
关键代码:
using system;
using system.data;
using system.data.oledb;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
public partial class _default : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
if (!ispostback)
{
string sdbpath = “./db_system.mdb”; //”
string spassword = “”;
string sdbtable = “tabitems”;
oledbconnection oconn = new oledbconnection(“provider=microsoft.jet.oledb.4.0;data source=” + server.mappath(sdbpath) + “;password=” + spassword + “;”);
oledbdatareader odr;
try
{
oconn.open();
oledbcommand ocmd = new oledbcommand(“select * from ” + sdbtable, oconn); // + ” order by f_level”
odr = ocmd.executereader();
//定义对象数组
treenode[] mynodes = new treenode[100];
//初始化对象数组
for (int i = 0; i < mynodes.length; i++)
{
mynodes[i] = new treenode();
}
//从表中取数据
while (odr.read())
{
int iparentnodeid = (int)odr[“f_parentnodeid”];
int imynodeid = (int)odr[“f_nodeid”];
if (iparentnodeid != 0)
{
mynodes[imynodeid].text = odr[“f_name”].tostring();
mynodes[imynodeid].navigateurl = odr[“f_url”].tostring();
mynodes[iparentnodeid].childnodes.add(mynodes[imynodeid]);
}
else
{
mynodes[imynodeid].text = odr[“f_name”].tostring();
mynodes[imynodeid].selectaction = treenodeselectaction.none;
treeview1.nodes.add(mynodes[imynodeid]);
}
}
}
catch (system.exception sqle)
{
sqle.tostring().replace(“\n”, “<br>”);
response.write(sqle);
}
finally
{
oconn.close();
}
}
}
}