对有父子关系的层级数据项,递归实现绑定到ListControl进行树状列表化的分层输出
数据库里有Category表,字段CategoryID,CategoryName,ParentID
也就是说,能够根据ParentID的存在而实现无限级分类.
约定CategoryID=0为最上层根目录
输出样式 以及在数据库里的结构
输出的类型为List<Category>, ListControl(比如ListBox,DropDownlist之类的控件)指定了TextField/ValueField后可以进行直接绑定
以ListBox为例:
CateList.DataSource = categoryHandler.BindToList(false);
CateList.DataTextField = "CategoryName";
CateList.DataValueField = "CategoryID";
CateList.DataBind();
CateList.Rows = CateList.Items.Count;
1
2
/// <summary>
3
/// 输出列表形式作为DropdownList或者Listbox的内容
4
/// </summary>
5
/// <param name="NeedRoot">输出的List里是否要包含虚拟的最上层根目录</param>
6
/// <returns></returns>
7
public List <Category> BindToList(bool NeedRoot)
8
{
9
10
List<Category> list = new List<Category>();
11
Category rootCate = new Category { CategoryID = 0, CategoryName = "RootCate" };
12
list.Add(rootCate);
13
list = GetCateTree(rootCate, list, 0);
14
if (NeedRoot)
15
return list;
16
else
17
{
18
list.Remove(rootCate);
19
return list;
20
}
21
}
22
23
/// <summary>
24
/// 递归实现输出List
25
/// </summary>
26
/// <param name="cate">入口Cate</param>
27
/// <param name="list">要处理的List</param>
28
/// <param name="level">入口Cate的级数</param>
29
/// <returns></returns>
30
private List<Category> GetCateTree(Category cate, List<Category> list , int level)
31
{
32
foreach (Category childCate in GetChildCategoryList(cate))
33
{
34
childCate.CategoryName = RenameForList(childCate.CategoryName, level);
35
list.Insert(list.IndexOf(cate)+1, childCate);
36
if (GetChildCategoryList(childCate).Count() > 0)
37
list = GetCateTree(childCate, list, level + 1);
38
}
39
return list;
40
}
41
42
/// <summary>
43
/// 重命名CateName,实现树状显示样式
44
/// </summary>
45
/// <param name="name"></param>
46
/// <param name="level"></param>
47
/// <returns></returns>
48
private string RenameForList(string name, int level)
49
{
50
string space = "";
51
if (level != 0)
52
space = "|--";
53
for (int i = 0; i < level; i++)
54
{
55
space = " "+ space ;//全角空格 半角绑定到ListControl会被自动Trim
56
}
57
return space + name;
58
}
59
60
/// <summary>
61
/// 取得所有子Cate的列表
62
/// </summary>
63
/// <param name="cate"></param>
64
/// <returns></returns>
65
private IEnumerable<Category> GetChildCategoryList(Category cate)
66
{
67
var childList = from c in db.Categories
68
where c.ParentID == cate.CategoryID
69
select c;
70
return childList;
71
}

2
/// <summary>3
/// 输出列表形式作为DropdownList或者Listbox的内容 4
/// </summary>5
/// <param name="NeedRoot">输出的List里是否要包含虚拟的最上层根目录</param>6
/// <returns></returns>7
public List <Category> BindToList(bool NeedRoot)8
{9

10
List<Category> list = new List<Category>();11
Category rootCate = new Category { CategoryID = 0, CategoryName = "RootCate" };12
list.Add(rootCate);13
list = GetCateTree(rootCate, list, 0);14
if (NeedRoot)15
return list;16
else17
{18
list.Remove(rootCate);19
return list;20
}21
}22

23
/// <summary>24
/// 递归实现输出List25
/// </summary>26
/// <param name="cate">入口Cate</param>27
/// <param name="list">要处理的List</param>28
/// <param name="level">入口Cate的级数</param>29
/// <returns></returns>30
private List<Category> GetCateTree(Category cate, List<Category> list , int level)31
{ 32
foreach (Category childCate in GetChildCategoryList(cate))33
{34
childCate.CategoryName = RenameForList(childCate.CategoryName, level);35
list.Insert(list.IndexOf(cate)+1, childCate);36
if (GetChildCategoryList(childCate).Count() > 0)37
list = GetCateTree(childCate, list, level + 1);38
}39
return list; 40
}41

42
/// <summary>43
/// 重命名CateName,实现树状显示样式44
/// </summary>45
/// <param name="name"></param>46
/// <param name="level"></param>47
/// <returns></returns>48
private string RenameForList(string name, int level)49
{50
string space = "";51
if (level != 0)52
space = "|--";53
for (int i = 0; i < level; i++)54
{55
space = " "+ space ;//全角空格 半角绑定到ListControl会被自动Trim56
}57
return space + name;58
}59

60
/// <summary>61
/// 取得所有子Cate的列表62
/// </summary>63
/// <param name="cate"></param>64
/// <returns></returns>65
private IEnumerable<Category> GetChildCategoryList(Category cate)66
{67
var childList = from c in db.Categories68
where c.ParentID == cate.CategoryID 69
select c;70
return childList;71
}

Category rootCate
浙公网安备 33010602011771号