加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#中构建多级树形结构的下拉列表框

(2009-10-22 14:27:53)
标签:

treeview

tree

下拉列表

dropdownlist

树状

多级

树形

递归

datarow

rowfi

it

刚在网上找关于多级树形结构数据表的设计时看到的,于是贴到这来,方便以后碰到类似的问题的时候可以直接拿来使用,也方便有同样需求的朋友可以拿来参考。

问题的需求其实还是蛮简单,就是要在一个下拉菜单里面将选项按照等级(有一个父子关系在里面起作用)排列成树状。如下图的样式:

C#中构建多级树形结构的下拉列表框

代码如下


 1http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif/// <summary> 
 2http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif///
 绑定生成一个有树结构的下拉菜单 
 3http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// </summary>
 
 4http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="dtNodeSets">菜单记录数据所在的表</param>
 
 5http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="strParentColumn">表中用于标记父记录的字段</param>
 
 6http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>
 
 7http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>
 
 8http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>
 
 9http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif/// <param name="drpBind">需要绑定的DropDownList</param>
 
10http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif/// <param name="i">用来控制缩入量的值,请输入-1</param> 

11http://www.cnblogs.com/Images/OutliningIndicators/None.gifprivate void MakeTree(DataTable dtNodeSets,string strParentColumn,

                      string strRootValue,string strIndexColumn,

                      string strTextColumn,DropDownList drpBind,int i) 
12

13http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    //每向下一层,多一个缩入单位 

14http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    i++
15
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif
16http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    DataView dvNodeSets = new
 DataView(dtNodeSets); 
17http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    dvNodeSets.RowFilter = strParentColumn + "=" +
 strRootValue; 
18
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif
19http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    string strPading = ""//
缩入字符 
20
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif
21http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    //通过i来控制缩入字符的长度,我这里设定的是一个全角的空格 

22http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    for(j=0;j<i;j++
23http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif        strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了 

24http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif
25http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    foreach(DataRowView drv in dvNodeSets) 
26http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif  

27http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif        ListItem li = new ListItem(strPading + "" +
 drv[strTextColumn].ToString(),drv[strIndexColumn].ToString()); 
28
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif        drpBind.Items.Add(li); 
29
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif        MakeTree(dtNodeSets,strParentColumn,drv[strIndexColumn].ToString(),strIndexColumn,strTextColumn,drpBind,i); 
30http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif    }
 
31
http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif
32http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    //递归结束,要回到上一层,所以缩入量减少一个单位 

33http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif    i--
34http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif}
 

这里其实是使用了DataView的RowFilter通过递归的办法来层层筛选子项目,然后设定了一个变量i来记录当前的层级数。原理还是很简单的,希望能解大家不时之需。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有