首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET DropDownList 無限階層分類資料綁定遞迴實作

     編輯:ASP.NET 基礎

資料結構

單表 ArticlesGroup:GroupId (PK), GroupName, ParentId (FK 自關聯)。根節點 ParentId = 0。

遞迴綁定方法


private string _indent = "├";

private void BindCategories(string parentId)
{
    using (var conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;"))
    using (var cmd = new SqlCommand(
        "SELECT GroupId, GroupName FROM ArticlesGroup WHERE ParentId=@pid ORDER BY GroupName", conn))
    {
        cmd.Parameters.AddWithValue("@pid", parentId);
        conn.Open();
        using (var dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                string id = dr["GroupId"].ToString();
                string name = dr["GroupName"].ToString();

                DropDownList1.Items.Add(new ListItem(_indent + " " + name, id));

                _indent += "─┴"; // 下一層縮進
                BindCategories(id); // 遞迴處理子節點
                _indent = _indent.Substring(0, _indent.Length - 2); // 回溯縮進
            }
        }
    }
}

頁面載入調用


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindCategories("0");
        DropDownList1.Items.Insert(0, new ListItem("Search All", "all"));
    }
    // 關鍵字輸入框焦點清空預設文字
    keyword.Attributes["onfocus"] = "if(this.value=='key key key') this.value='';";
}

效能與擴充建議

  • 遞迴深度:層級過深(>20)可能造成堆疊溢位,改用迴圈 + Stack 模擬遞迴。
  • N+1 查詢問題:每層查詢一次資料庫。大量資料建議一次撈全表至 DataTable,記憶體中用 DataView.RowFilter 或 LINQ 篩選子節點。
  • 快取:分類變動低,可快取完整樹結構(HttpRuntime.Cache),依賴 SqlCacheDependency 或檔案監視失效。
  • 前端替代:大樹建議改用 jsTree、zTree 等客戶端樹狀元件,支援懶加載、搜尋、拖曳排序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved