数据库里有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![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/// <summary>
3
/// 输出列表形式作为DropdownList或者Listbox的内容
4
/// </summary>
5
/// <param name="NeedRoot">输出的List里是否要包含虚拟的最上层根目录</param>
6
/// <returns></returns>
7
public
List
<
Category
>
BindToList(
bool
NeedRoot)
8![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
9![](/Images/OutliningIndicators/InBlock.gif)
10
List<Category> list = new List<Category>();
11![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18
list.Remove(rootCate);
19
return list;
20
}
21
}
22![](/Images/OutliningIndicators/None.gif)
23![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/// <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![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
32
foreach (Category childCate in GetChildCategoryList(cate))
33![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](/Images/OutliningIndicators/None.gif)
42![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/// <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![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
50
string space = "";
51
if (level != 0)
52
space = "|--";
53
for (int i = 0; i < level; i++)
54![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
55
space = " "+ space ;//全角空格 半角绑定到ListControl会被自动Trim
56
}
57
return space + name;
58
}
59![](/Images/OutliningIndicators/None.gif)
60![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/// <summary>
61
/// 取得所有子Cate的列表
62
/// </summary>
63
/// <param name="cate"></param>
64
/// <returns></returns>
65
private
IEnumerable
<
Category
>
GetChildCategoryList(Category cate)
66![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
67
var childList = from c in db.Categories
68
where c.ParentID == cate.CategoryID
69
select c;
70
return childList;
71
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)