本来这是2004年9月份的时候在CSDN回答一个朋友的提问临时写出来的一段代码。没想到昨天居然也碰到了类似的问题,正好需要使用这段代码。干脆整理出来放到这里存个档,也方便以后再碰到类似的问题的时候可以直接拿来使用,也方便有同样需求的朋友可以拿来参考。
问题的需求其实还是蛮简单,就是要在一个下拉菜单里面将选项按照等级(有一个父子关系在里面起作用)排列成树状。如下图的样式:
代码如下
构建多级树形结构下拉列表
1/**//// <summary>
2/// 绑定生成一个有树结构的下拉菜单
3/// </summary>
4/// <param name="dtNodeSets">菜单记录数据所在的表</param>
5/// <param name="strParentColumn">表中用于标记父记录的字段</param>
6/// <param name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>
7/// <param name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>
8/// <param name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>
9/// <param name="drpBind">需要绑定的DropDownList</param>
10/// <param name="i">用来控制缩入量的值,请输入-1</param>
11private void MakeTree(DataTable dtNodeSets,string strParentColumn,string strRootValue,string strIndexColumn,string strTextColumn,DropDownList drpBind,int i)
12{
13 //每向下一层,多一个缩入单位
14 i++;
15
16 DataView dvNodeSets = new DataView(dtNodeSets);
17 dvNodeSets.RowFilter = strParentColumn + "=" + strRootValue;
18
19 string strPading = ""; //缩入字符
20
21 //通过i来控制缩入字符的长度,我这里设定的是一个全角的空格
22 for(j=0;j<i;j++)
23 strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了
24
25 foreach(DataRowView drv in dvNodeSets)
26 {
27 ListItem li = new ListItem(strPading + "├" + drv[strTextColumn].ToString(),drv[strIndexColumn].ToString());
28 drpBind.Items.Add(li);
29 MakeTree(dtNodeSets,strParentColumn,drv[strIndexColumn].ToString(),strIndexColumn,strTextColumn,drpBind,i);
30 }
31
32 //递归结束,要回到上一层,所以缩入量减少一个单位
33 i--;
34}
1/**//// <summary>
2/// 绑定生成一个有树结构的下拉菜单
3/// </summary>
4/// <param name="dtNodeSets">菜单记录数据所在的表</param>
5/// <param name="strParentColumn">表中用于标记父记录的字段</param>
6/// <param name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>
7/// <param name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>
8/// <param name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>
9/// <param name="drpBind">需要绑定的DropDownList</param>
10/// <param name="i">用来控制缩入量的值,请输入-1</param>
11private void MakeTree(DataTable dtNodeSets,string strParentColumn,string strRootValue,string strIndexColumn,string strTextColumn,DropDownList drpBind,int i)
12{
13 //每向下一层,多一个缩入单位
14 i++;
15
16 DataView dvNodeSets = new DataView(dtNodeSets);
17 dvNodeSets.RowFilter = strParentColumn + "=" + strRootValue;
18
19 string strPading = ""; //缩入字符
20
21 //通过i来控制缩入字符的长度,我这里设定的是一个全角的空格
22 for(j=0;j<i;j++)
23 strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了
24
25 foreach(DataRowView drv in dvNodeSets)
26 {
27 ListItem li = new ListItem(strPading + "├" + drv[strTextColumn].ToString(),drv[strIndexColumn].ToString());
28 drpBind.Items.Add(li);
29 MakeTree(dtNodeSets,strParentColumn,drv[strIndexColumn].ToString(),strIndexColumn,strTextColumn,drpBind,i);
30 }
31
32 //递归结束,要回到上一层,所以缩入量减少一个单位
33 i--;
34}
这里其实是使用了DataView的RowFilter通过递归的办法来层层筛选子项目,然后设定了一个变量i来记录当前的层级数。原理还是很简单的,希望能解大家不时之需。
在CSDN上面的问答贴地址是:http://topic.csdn.net/t/20040904/17/3340484.html