在SQL Server中巧妙存储树形结构数据
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 += "
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) |