• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[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

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: T.Bảy 26/04/2008 6:10 pm
Has thanked: 16 time
Been thanked: 10 time

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

Gửi bàigửi bởi tindl88 » CN 04/09/2011 2:28 pm

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

  1.    
  2.     public struct Category
  3.     {
  4.         public int id { get; set; }
  5.         public string name { get; set; }
  6.         public int parentid { get; set; }
  7.     }
  8.  
  9.     protected List<Category> Recursive(List<Category> cateData, int parentid, string seperator = "")
  10.     {
  11.         List<Category> cateTree = new List<Category>();
  12.  
  13.         var CateList = cateData.Where(m => m.parentid == parentid);
  14.         if (CateList.Any())
  15.         {
  16.             Category c = new Category();
  17.             foreach (var cateItem in CateList)
  18.             {
  19.                 c.id = cateItem.id;
  20.                 c.name = seperator + cateItem.name;
  21.                 c.parentid = cateItem.parentid;
  22.                 cateTree.Add(c);
  23.                 cateTree.AddRange(Recursive(cateData, cateItem.id, seperator + "|----"));
  24.             }
  25.         }
  26.         return cateTree;
  27.     }
  28.     protected void Page_Load(object sender, EventArgs e)
  29.     {
  30.         //Dữ liệu demo
  31.         List<Category> Data = new List<Category> {
  32.             new  Category{id = 1, parentid = 0, name = "Điện thoại" },
  33.             new  Category{id = 2, parentid = 1, name = "Nokia" },
  34.             new  Category{id = 3, parentid = 2, name = "Lumia 928" },
  35.             new  Category{id = 4, parentid = 0, name = "Xe máy" },
  36.             new  Category{id = 5, parentid = 4, name = "Yamaha Exciter" },
  37.             new  Category{id = 6, parentid = 0, name = "TV" },
  38.             new  Category{id = 7, parentid = 6, name = "Samsung" },
  39.             new  Category{id = 8, parentid = 7, name = "Slimfit" }
  40.         };
  41.  
  42.         GridView1.DataSource = Recursive(Data, 0);
  43.         GridView1.DataBind();
  44.     }
  45.  

dmdacap.png
Demo
dmdacap.png (15.38 KiB) Đã xem 2919 lần

category.rar
sourcecode
(18.89 KiB) Đã tải 185 lần
Sửa lần cuối bởi tindl88 vào ngày T.Hai 01/04/2013 1:44 am với 2 lần sửa.



Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 959
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

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

Gửi bàigửi bởi dazzlingvit » T.Ba 13/09/2011 11:01 am

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. }
  9.  

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. // ...
  9.  

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. }
  7.  

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: T.Bảy 26/04/2008 6:10 pm
Has thanked: 16 time
Been thanked: 10 time

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

Gửi bàigửi bởi tindl88 » T.Hai 01/04/2013 1:40 am

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


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

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách