上拉框弹出树形菜单

下拉框弹出树形菜单
本人想要一个点击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);   
}