数据库与递归搭配的技巧

上一篇 / 下一篇  2012-07-03 08:42:16 / 个人分类:数据库

51Testing软件测试网&]-V6J'e M$e,R(Pq$g&j2}

  本文讨论一个非常实用的示例,将分类数据从数据库中提取出来,再通过递归技巧根据分类建立TreeView节点。51Testing软件测试网M-]d6Ra/R5L

v(G*gTI6h*W ~ K6S yP0  示例CatTreeVeiw51Testing软件测试网9eN^f M[

51Testing软件测试网7Rt#d)UUa?9bY

  为了实现这个示例,我们设计了一个用来储存技术文件分类名称的数据库,数据表结构与其中所储存的数据如下图所示。

L_`3i l ] xi3R0

-[2OA"N6tot_L Cg0

   数据表中的每一笔数据均代表一个特定的分类项目,字段bookCatID则是这个分类的唯一识别编号,字段bookCatIDParent用来链接分类 项目的上一层分类,如果当前这一个分类项目是某个分类的子分类,则此字段必须填入其上层分类项目的bookCatID。

eY*Z~(|%i~0

  先来看看这个示例的执行结果,页面如下图所示。51Testing软件测试网F0q [)^W5Xc5X*~

zN7Q9t{4oVZJ0

  这个示例的重点在于数据表的设计,也就是关联字段bookCatIDParent,我们通过这个字段运用递归式,提取所需的架构数据。网页的内容很简单,配置了一个TreeView控件,配置程序代码的内容如下:

Kn~z-e^0

\2]Up;l }:c9L0public partial class _Default : System.Web.UI.Page {protected void Page_Load(object sender, EventArgs e){ if (!IsPostBack){String sqlString = "SELECT * FROM BooksCat ";SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["CBooksConnectionString"].ToString());SqlCommand sqlCmd = new SqlCommand(sqlString, sqlConn);51Testing软件测试网2J+?XtB|:Z
DataSet dataSet = new DataSet();
#a'N(Ty1gM8Y P0SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCmd);

_ dn$x+`` w8}'p051Testing软件测试网\:J8rf-g6i ? ly

51Testing软件测试网(Y@ lZ|@
sqlDataAdapter.Fill(dataSet);51Testing软件测试网w%As I*\IC
DataTable dt = dataSet.Tables[0];51Testing软件测试网(@8O*`@;r5?2C I
SetTreeViewNode(dt, "0000", null);
1w)z Q8@ Jx#e3C0}51Testing软件测试网|v8D5gg"b
}
SDem2^`? P~0private void SetTreeViewNode(DataTable dt  ,51Testing软件测试网k e-V {n@D/N$@X
string parentID ,
!jd-~~'x0TreeNode treeNode)
*_8k-fm6pZ)fd S0{
`L,Q0tR ~Tk0DataView dv = dt.DefaultView;51Testing软件测试网,t&_Y%B"b3P{
dv.Sort = "bookCatIDParent";51Testing软件测试网| { s/Km"v*T+O/} s/e
DataRowView[] drvs =  dv.FindRows(parentID);
x-`U(ghZzAc;]/Y0if (drvs.Length > 0)
3C$TFU3~0{51Testing软件测试网0p%_QFi^A/G
foreach (DataRowView drv in drvs)
,xdF]7Ec*]b8?0Oa0{             
%y ~/]a*g{5F2e0String bookCatIDParent = drv["bookCatID"].ToString();51Testing软件测试网oE6k%vc
String bookCatDesc = drv["bookCatDesc"].ToString();51Testing软件测试网-Al.z?[:d'KA p
TreeNode newTreeNode = new TreeNode( bookCatDesc +
`#C Nm-rvvx8@)^'V+K0"[" + bookCatIDParent + "]" );
o3O;Ny5`s0SetTreeViewNode(dt, bookCatIDParent, newTreeNode);
&JC'{[?+[0SetTreeView(treeNode, newTreeNode);
Ks%a#B_|H#\0}
;sD `:[#n s:\h/V0}51Testing软件测试网)ds!l)A4~8g#cT y\
}
L2~-r"q'L6?+q0private void SetTreeView(TreeNode treeNode, TreeNode newTreeNode)
|:V+Fur_!^0{
vo;F j.xj0if (treeNode == null)
}%Q;Qf7Xg0BookViewTreeView.Nodes.Add(newTreeNode);51Testing软件测试网)^-XKZ*Y5[ ?r6l
else51Testing软件测试网A KVrU DC'Q
treeNode.ChildNodes.Add(newTreeNode);      51Testing软件测试网c!XI_xMt$~{
}51Testing软件测试网0]%i%d:_N
}

srAou0

   SetTreeViewNode与SetTreeView这两个函数分别用来设置TreeView控件的组成节点,SetTreeViewNode接受 3个参数:dt为整个分类数据表的数据内容;parentID用来取得所有bookCatIDParent字段等于此参数的数据;treeNode则是取 得的数据所要附加上去的上层节点。其中阴影部分的程序代码调用自已形成递归运算,直至传送进去的parentID再也没有数据以其为上层分类。 SetTreeView则执行节点的创建动作。51Testing软件测试网5ou#Ef4A6cmc@

  现在回到Page_Load方法,这个事件处理程序在网页加 载的时候执行,其中首先取得BooksCat数据表的内容,然后引用SetTreeViewNode方法,将取得的DataTable对象及最上层分类项 目的bookCatIDParent域值--0000,当做参数输入,由于是最上层的分类,因此最后一个参数直接设为null。51Testing软件测试网 A-] ns!rh#i F

  通过数据表字段的关联设计及递归式的运用,我们就可以在页面上轻松地呈现出一个不限层次的树状架构图,善用这个技术,可以让你设计出非常具有弹性的树状导航架构。

[8Oa'YY%?s2|0

TAG:

 

评分:0

我来说两句

Open Toolbar