在SQL Server中巧妙存储树形结构数据

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、提供的树形控件能展示树形层次,但点击查看当前结点的子结点时造成

aspx页面代码执行,重新读取数据库,重新刷新页面,这里javaScript无刷新指的是树形结构数据一次加载完成,点击展开和折叠子结点时通过javaScript完成,无页面代码执

行,无数据获取操作,无页面刷新。

二.、提供的GridView控件只能展示二维的表格信息,如下图所示

这里树形GridView指的是除了显示多列数据外,还可显示多行数据间树形层次关系如下面的两幅图中GridView有三列,其中分类名称列是树形结构数据

三、在存储树形结构数据时,一般按下面的方式建表

按上面的方式建表,如使用的树形控件加载数据时,就得写递归函数,递归加载父结点的子结点

有一种巧妙的方式在上面所建的表中再增加一列,如下图所示

新增加的列叫parentPath,记录了从根结点到子结点所经过的所有结点ID,例如从根结点五华区到云南大学子结点所经过的结点为

五华区—一二一大街—云南大学,所以parentPath为,5,7,8

新增加的列parentPath目的是方便读取树形结构的数据,只需一条简单的SQL语句就可将树形结构信息提取出来

SELECT * FROM 含parentPath列的表

order by parentPath

通过一句order by parentPath简单高效提取了树形结构信

四、下面是开发的电子商务类网站项目中的代码

下面是建表的SQL语句

下图是数据库表结构和数据

该存储过程执行结果如下图所示

前台页面代码

GridView绑定列调用的函数

<%# strclass(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "id")))%> public string strclass(int classid)

{

if (classid == 0)

{

dv_allRecord.RowFilter = "";

}

else

{

dv_allRecord.RowFilter = "id=" + classid.ToString();

}

string classname = "";

System.Data.DataView dv_temp = new DataView(dt_allRecord);

dv_temp.RowFilter = "parentId=" + classid;

int childCount = dv_temp.Count;

classname += "

";

classname += "

";

for (int j = 0; j < dv_allRecord.Count; j++)

{

DataRowView dr = dv_allRecord[j];

int depth;

depth = Convert.ToInt32(dr["depth"]);

if (depth > 0)

{

for (int i = 1; i <= depth; i++)

{

#region .....

classname += "

";

if (i == depth)

{

if (childCount > 0)

{

classname += "

";

}

else

{

classname += "

";

}

}

#endregion

}

}

else

{

if (childCount > 0)

{

classname += "

";

}

}

classname += "

background-color :#F6F6F6;\">

background-image :url(../images/tree_close.gif);\" onclick=\"hideOrShowTr(this,'" +

dr["jsparameter"].ToString() + "'," + dr["rownumber"].ToString() + ")\" id=\"hideshowbtn" + classid + "\">

background-image :url(../images/treeleaf.gif);\">

background-image :url(../images/tree_close.gif);\" onclick=\"hideOrShowTr(this,'" +

dr["jsparameter"].ToString() + "'," + dr["rownumber"].ToString() + ")\" id=\"hideshowbtn" + classid + "\">

";

if (Convert.ToInt32(dr["parentId"]) == 0)

{

classname += "";

}

classname += dr["className"].ToString();

if (childCount > 0)