• 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

Moderator: vietluyen

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

Postby tindl88 » Sun 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) Viewed 5176 times

category.rar
sourcecode
(18.89 KiB) Downloaded 259 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: 7 times
Been thanked: 112 times
Contact:

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

Postby dazzlingvit » Tue 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 đó:
[csharp]
// ... (IDataReader r)
var lst = new Dictionary<int, SanPham>();
while (r.Read())
{
var sp = new SanPham() { ID = (int)r["id"], Name = (string)r["name"], ParentID = (int)r["parentid"], ChildSPs = new List<SanPham>() };
lst.Add(sp.ID, sp);
}
// ...
[/csharp]
Và thực hiện việc phân lớp như sau:
[csharp]
lst.Add(0, new SanPham() { ID = 0, ChildSPs = new List<SanPham>() }); // Tạo "sản phẩm" gốc
foreach (var item in lst)
{
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
lst[item.ParentID].ChildSPs.Add(item.Value);
}
[/csharp]
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

Postby tindl88 » Mon 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.


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

Who is online

Users browsing this forum: No registered users and 1 guest