PDA

View Full Version : [ASP.NET] Tạo Menu đa cấp load từ SQL Server



nmhung
05-03-2012, 10:48 AM
Với menu 1 cấp chúng ta hoàn toàn ko cần viết code lập trình vì với 2 control Repeater và SqlDataSource đã đủ làm việc đó. Nhưng với menu đa cấp (đặc biệt là ko giới hạn cấp) thì 2 control trên pó tay
Bài này mình sẽ hướng dẫn các bạn viết code để tạo menu không giới hạn cấp bằng cách dùng đệ qui
Ở đây mình không phân tích đệ qui là gì. Xem như mọi người đã biết

Ví dụ ta có DB và một table [chuyenmuc] gồm 3 trường:
- chuyenmuc_id: mã của chuyên mục.
- chuyenmuc_name: Tên của chuyên mục.
- chuyenmuc_parent: mã chuyên mục cha. nếu không có chuyên mục cha thì mã là 0

Thông thường để tạo menu (dù 1 hay nhiều cấp) ta đều dùng tag

của html. trong bài này mình cũng dùng tag này.
Vậy kết quả mà ta cần là một đoạn html có dạng:

<ul>
<li>Menu 1 </li>
<ul>
<li>Menu 1.1 </li>
<li>Menu 1.2 </li>
<li>Menu 1.3 </li>
<ul>
<li>Menu 1.3.1 </li>
<li>Menu 1.3.2 </li>
</ul>
</ul>
<li>Menu 2 </li>
<ul>
<li>Menu 2.1 </li>
<li>Menu 2.2 </li>
</ul>
<li>Menu 3 </li>
<ul>
<li>Menu 3.1 </li>
<li>Menu 3.2 </li>
</ul>
</ul>

Bước 1: Trong trang aspx tạo một Label đặt ID=menu


<asp:Label ID=”menu” runat=”server” Text=”"></asp:Label>

Bước 2: Viết hàm đệ qui để load menu với nội dung như sau:


public string loadmenu(int parentid, int level)
{
string result = string.Empty;
string ConnectString = “Data Source=IP SERVER;User ID=USERNAME;Password=PASSWORD”;
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
conn.ConnectionString = ConnectString;

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = “SELECT * FROM [chuyenmuc] WHERE [chuyenmuc_parent] = ” + parentid.ToString();
cmd.Connection = conn;
conn.Open();
System.Data.SqlClient.SqlDataReader rd = cmd.ExecuteReader();
if (!rd.HasRows)
return result;
else
{
result = ”

“;
while (rd.Read())
{
result += ”
” + rd.GetString(rd.GetOrdinal(“chuyenmuc_name”)) + “
“;
result += loadmenu(rd.GetInt32(rd.GetOrdinal(“chuyenmuc_id ”) ), level + 1);
}
result += “

“;
conn.Close();
}
return result;
}

Trong đoạn code trên bạn chú ý biến ConnectString có 3 giá trị cần thay đổi cho phù hợp với bạn là: IP SERVER, USERNAME, PASSWORD.

Vậy là ta đã có một hàm đệ qui trả về giá trị là một string. Hàm này mỗi lần lấy được một chuyên mục sẽ tiếp tục gọi chính nó và tìm chuyên mục con của chuyên mục hiện tại. Cứ như thế cho đến khi đọc hết DB.

Bước 3: Trong Page_Load gọi hàm loadmenu và gán cho label menu là dc.


menu.Text = loadmenu(0, 0);

Vậy là chỉ trong 3 bước bạn đã có một menu không giới hạn cấp rồi đó.

Ghi chú:Vì hàm này mỗi lần dc gọi là thực hiện truy cập DB nhiều lần nên có thể ảnh hưởng tốc độ. Vì vậy bạn nên lưu giá trị đã tìm dc vào một file nào đó. Chỉ khi nào có thay đổi trên menuthì cập nhật lại file này

mairoixa
13-03-2012, 02:31 PM
Đang cần cái này, cám ơn nhiều nha :x