[ASP.NET] (C#) Tạo danh mục đa cấp

Các bài viết giới thiệu và hướng dẫn dành cho lập trình Web Forms

Moderator: vietluyen

Post Reply
tindl88
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 363
Joined: Sat 26/04/2008 6:10 pm
Has thanked: 16 times
Been thanked: 10 times

[ASP.NET] (C#) Tạo danh mục đa cấp

Post by tindl88 »

Thủ thuật: Tạo danh mục đa cấp
Tác giả: tindl88
Mô tả: Tạo danh mục đa cấp, không giới hạn số cấp
Tham khảo trước

[asp]
public struct Category
{
public int id { get; set; }
public string name { get; set; }
public int parentid { get; set; }
}

protected List<Category> Recursive(List<Category> cateData, int parentid, string seperator = "")
{
List<Category> cateTree = new List<Category>();

var CateList = cateData.Where(m => m.parentid == parentid);
if (CateList.Any())
{
Category c = new Category();
foreach (var cateItem in CateList)
{
c.id = cateItem.id;
c.name = seperator + cateItem.name;
c.parentid = cateItem.parentid;
cateTree.Add(c);
cateTree.AddRange(Recursive(cateData, cateItem.id, seperator + "|----"));
}
}
return cateTree;
}
protected void Page_Load(object sender, EventArgs e)
{
//Dữ liệu demo
List<Category> Data = new List<Category> {
new Category{id = 1, parentid = 0, name = "Điện thoại" },
new Category{id = 2, parentid = 1, name = "Nokia" },
new Category{id = 3, parentid = 2, name = "Lumia 928" },
new Category{id = 4, parentid = 0, name = "Xe máy" },
new Category{id = 5, parentid = 4, name = "Yamaha Exciter" },
new Category{id = 6, parentid = 0, name = "TV" },
new Category{id = 7, parentid = 6, name = "Samsung" },
new Category{id = 8, parentid = 7, name = "Slimfit" }
};

GridView1.DataSource = Recursive(Data, 0);
GridView1.DataBind();
}
[/asp]
Demo
Demo
dmdacap.png (15.38 KiB) Viewed 7844 times
category.rar
sourcecode
(18.89 KiB) Downloaded 310 times
Last edited by tindl88 on Mon 01/04/2013 1:44 am, edited 2 times in total.
User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 6 times
Been thanked: 112 times
Contact:

Re: [ASP.NET] (C#) Tạo danh mục đa cấp

Post by dazzlingvit »

Với mỗi cấp bạn phải thực hiện một truy vấn và thực hiện thêm vào bảng dtCate.
Mình đề xuất bạn nên thực hiện một truy vấn đọc toàn bộ dữ liệu và thực hiện xử lý trên bộ nhớ. Ví dụ:
  1. class SanPham
  2. {
  3.   public int ID { get; set; }
  4.   public string Name { get; set; }
  5.   public int ParentID { get; set; }
  6.  
  7.   public List<SanPham> ChildSPs { get; set; }
  8. }

Trong đó ChildSPs là danh sách những sản phẩm "con" nằm ở cấp dưới của sản phẩm hiện tại. Khi đó bạn đọc toàn bộ bảng dữ liệu sử dụng IDataReader (cụ thể ở đây là SqlDataReader), khi đó:
  1. // ... (IDataReader r)
  2. var lst = new Dictionary<int, SanPham>();
  3. while (r.Read())
  4. {
  5.   var sp = new SanPham() { ID = (int)r["id"], Name = (string)r["name"], ParentID = (int)r["parentid"], ChildSPs = new List<SanPham>() };
  6.   lst.Add(sp.ID, sp);
  7. }
  8. // ...

Và thực hiện việc phân lớp như sau:
  1. lst.Add(0, new SanPham() { ID = 0, ChildSPs = new List<SanPham>() }); // Tạo "sản phẩm" gốc
  2. foreach (var item in lst)
  3. {
  4.   if (lst.ContainsKey(item.Value.ParentID)) // Kiểm tra xem "sản phẩm" mẹ có thực sự tồn tại hay không
  5.     lst[item.ParentID].ChildSPs.Add(item.Value);
  6. }

Giờ bạn đã có một cấu trúc nhiều lớp rất trực quan dựa trên các đối tượng cụ thể. Việc khai thác dữ liệu này kiểu gì là tuỳ mục đích cụ thể ;)
tindl88
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 363
Joined: Sat 26/04/2008 6:10 pm
Has thanked: 16 times
Been thanked: 10 times

Re: [ASP.NET] (C#) Tạo danh mục đa cấp

Post by tindl88 »

Cảm ơn dazzlingvit đã gợi ý. Mình đã chỉnh lại code và upload mã nguồn mới ở đầu trang.
Post Reply

Return to “[ASP.NET] Bài viết giới thiệu, hướng dẫn”