[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

Điều hành viên: vietluyen

Đăng trả lời
tindl88
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 363
Ngày tham gia: Thứ 7 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

Gửi bài 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) Đã xem 7916 lần
category.rar
sourcecode
(18.89 KiB) Đã tải về 316 lần
Sửa lần cuối bởi 2 vào ngày tindl88 với 0 lần sửa trong tổng số.
Hình đại diện của thành viên
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: Thứ 3 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 6 times
Been thanked: 112 times
Tiếp xúc:

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

Gửi bài 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
Bài viết: 363
Ngày tham gia: Thứ 7 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

Gửi bài by tindl88 »

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

Quay về