加载中…
个人资料
KfCalf
KfCalf
  • 博客等级:
  • 博客积分:0
  • 博客访问:35,093
  • 关注人气:6
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

ASP.NET 无限级分类 只需读取数据库一次 DropDownList 实例

(2013-02-24 22:01:03)
标签:

只需

来自网络

数据

实例

空格

分类: asp.net

最近做个项目需要做分类,在网上找的很多方法都是每分级一次就连接一次数据库,那样的效率太低而且太占用资源了。

下面是实例:

数据库:

┌─────┬─────┬─────────┬────────┐

ID Parent ClassName ClassLevel

└─────┴─────┴─────────┴────────┘

ID为自增列

Parent 为父级ID

ClassName 为分类名称

ClassLevel 为分类级别 顶级0 | 一级1 | 二级2 以此类推

测试数据:

┌───┬────┬────────┬──────┐

1 0 顶级分类1 0

2 0 顶级分类2 0

─────────────────────────

3 1 一级分类1 1

4 2 一级分类2 1

─────────────────────────

5 3 二级分类1 2

6 4 二级分类2 2

─────────────────────────

7 5 三级分类1 3

8 6 三级分类2 3

.........

.........

└───┴────┴────────┴──────┘

 

C#Code:

 

///
/// 重组DataTable
///
private void ResetDT()
{

DataTable dt = new BllArticleClass().GetList("", "", "ID,Parent ASC").Tables[0];
for (int i = 0; i < dt.Rows.Count; i++)
{
int count = Convert.ToInt32(dt.Rows[i]["ClassLevel"].ToString());
string temp = string.Empty;
for (int j = 0; j < count; j++)
{
temp += " "; //注意这里使用全角空格
}
if (count != 0)
temp += "└─";
else
temp = temp.Trim();
dt.Rows[i]["ClassName"] = temp + dt.Rows[i]["ClassName"].ToString();
}
BindingDL(dt);

}

///
/// 创建新DataTable并添加顶级分类
///
/// 重组过的DataTable
private void BindingDL(DataTable DT)
{
DataTable dt = new DataTable();
dt.Columns.Add("ClassName");
dt.Columns.Add("ClassRowID");
DataRow dr = dt.NewRow();
dr["ClassName"] = "请选择";
dr["ClassRowID"] = "0";
dt.Rows.Add(dr);
DataView dv = DT.DefaultView;
dv.RowFilter = "[Parent]=0";
foreach (DataRowView drv in dv)
{
dr = dt.NewRow();
dr["ClassName"] = drv["ClassName"].ToString();
dr["ClassRowID"] = drv["ID"].ToString();
dt.Rows.Add(dr);
BindingChild(dv, dt, dr, drv["ID"].ToString());
}
DropDownList1.DataSource = dt; //DropDownList控件
DropDownList1.DataTextField = "ClassName";
DropDownList1.DataValueField = "ClassName";
DropDownList1.DataBind();
}

///
/// 递归获数据并把数据添加到新DataTable中
///
/// 新行
/// 父级行ID
private void BindingChild(DataView dv, DataTable dt, DataRow dr, string parent)
{
dv.RowFilter = "[Parent]=" + parent;
foreach (DataRowView drv in dv)
{
dr = dt.NewRow();
dr["ClassName"] = drv["ClassName"].ToString();
dr["ClassRowID"] = drv["ID"].ToString();
dt.Rows.Add(dr);
BindingChild(dv, dt, dr, drv["ID"].ToString());
}
}

来自http://dooqoo.blog.163.com/blog/static/178149059201110511516314/

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

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

    新浪公司 版权所有