当前位置: 代码迷 >> ASP.NET >> 上拉框弹出树形菜单
  详细解决方案

上拉框弹出树形菜单

热度:435   发布时间:2013-02-25 00:00:00.0
下拉框弹出树形菜单
本人想要一个点击dropdownlist控件后,下拉出来的是一个树形的菜单,这个树形需要是通过查询SQL的,而不是通过JS里面的数据。而且每个节点都是可以选择的,不是只能够选择最小子节点的。

开发环境:VS2008
语言:C#
数据库:SQLSever 2005


谢谢。

------解决方案--------------------------------------------------------
SQL code
  测试数据   DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))   INSERT @t SELECT '001',NULL ,'山东省'  UNION ALL SELECT '002','001','烟台市'  UNION ALL SELECT '004','002','招远市'  UNION ALL SELECT '003','001','青岛市'  UNION ALL SELECT '005',NULL ,'四会市'  UNION ALL SELECT '006','005','清远市'  UNION ALL SELECT '007','006','小分市'    --深度排序显示处理   --生成每个节点的编码累计(相同当单编号法的编码)   DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))   DECLARE @Level int  SET @Level=0   INSERT @t_Level SELECT ID,@Level,ID   FROM @t   WHERE PID IS NULL   WHILE @@ROWCOUNT>0   BEGIN       SET @Level=@Level+1       INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID       FROM @t a,@t_Level b       WHERE a.PID=b.ID           AND b.Level=@Level-1   END     --显示结果   SELECT SPACE(b.Level*2)+'|--'+a.Name   FROM @t a,@t_Level b   WHERE a.ID=b.ID   ORDER BY b.Sort   /*--结果  |--山东省    |--烟台市      |--招远市    |--青岛市  |--四会市    |--清远市      |--小分市  --*/
------解决方案--------------------------------------------------------
C# code
/// <summary>   /// 页面加载   /// </summary>   /// <param name="sender"></param>   /// <param name="e"></param>   protected void Page_Load(object sender, EventArgs e)   {       //加载页面时,动态读取国家列表到DropList       CreateTree();   }     ///   <summary>      ///   绑定生成一个有树结构的下拉菜单      ///   </summary>      ///   <param   name="dtNodeSets">菜单记录数据所在的表</param>      ///   <param   name="strParentColumn">表中用于标记父记录的字段</param>      ///   <param   name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>      ///   <param   name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>      ///   <param   name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>      ///   <param   name="drpBind">需要绑定的DropDownList</param>      ///   <param   name="i">用来控制缩入量的值,请输入-1</param>      private void MakeTree(DataTable dtNodeSets, string strParentColumn, string strRootValue, string strIndexColumn, string strTextColumn, DropDownList drpBind, int i)   {       //每向下一层,多一个缩入单位          i++;         DataView dvNodeSets = new DataView(dtNodeSets);       dvNodeSets.RowFilter = strParentColumn + "=" + strRootValue;         string strPading = "";     //缩入字符           //通过i来控制缩入字符的长度,我这里设定的是一个全角的空格          for (int j = 0; j < i; j++)           strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了           foreach (DataRowView drv in dvNodeSets)       {           TreeNode tnNode = new TreeNode();           ListItem li = new ListItem(strPading + "├" + drv[strTextColumn].ToString(), drv[strIndexColumn].ToString());           drpBind.Items.Add(li);           MakeTree(dtNodeSets, strParentColumn, drv[strIndexColumn].ToString(), strIndexColumn, strTextColumn, drpBind, i);       }         //递归结束,要回到上一层,所以缩入量减少一个单位          i--;   }     /// <summary>   /// SQL语句查询,再绑定到DropList里面   /// </summary>   private void CreateTree()   {       //查询ZoneList       string sql = "SELECT *FROM Zone";       DataTable dt= DataAccess.GetDataSet(sql);         MakeTree(dt, "parentid", "0", "zone_id", "zonename_en", zone_id, -1);   }
  相关解决方案