递归实现dropdownlist树型结构的栏目实例

看到网上有很多DrowDownList的树形结构绑定,偶也看到一个稍微改了下,就是自动计算属于第几层的代码

数据库目录为MenuID,MName,fID

原地址为:http://www.5icoding.com/n36.aspx

 

数据库结构:

效果图:

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;

public partial class TreeDropDownList : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            DataTable table;
            
string con = ConfigurationManager.AppSettings["TreeConnectionString"].ToString();
            SqlConnection conn 
= new SqlConnection(con);
            SqlDataAdapter sda 
= new SqlDataAdapter("select * from Menu", conn);
            table 
= new DataTable();
            sda.Fill(table);


            BindToChannelList(table, 
0,0);   
        }

    }


       
/// <summary>   
         
/// 递归绑定数据到ddlChannelList控件上,形成树状结构   
         
/// </summary>   
         
/// <param name="dt">数据源</param>   
         
/// <param name="categoryid">栏目id</param>   

        private void BindToChannelList(DataTable dt, int categoryid, int layer)   
         
{   
   
              
//DataView dv = dt.DefaultView;使用这句在asp.net 1.1中会出现"在位置 1 处没有任何行。"的错误,感谢阿耀同学的帮助.   
   
              DataView dv
=new DataView(dt);   
                
             dv.RowFilter 
= " fID= " + categoryid.ToString(); //过滤   

             
if (categoryid != 0)
             
{
                 layer
++//默认为第一层 ,以前有实例是数据库一列保存层的数据,这里是自动计算,默认为0
             }

             
foreach (DataRowView drv in dv)   
             
{   
                   
                   
string span = "";
                 
if (categoryid != 0)
                 
{

                     
for (int i = 0; i < layer; i++)//如果i=0,显示的时候第一级菜单就少了个空格
                     {
                         span 
+=" ";
                     }

                     span 
+= "";//添加前面的空格   
                 }



                 ListItem li 
= new ListItem();
                 li.Text 
= span + drv["MName"].ToString();
                 li.Value 
= drv["MenuID"].ToString();   
                 
this.ddlChannelList.Items.Add(li);
                 BindToChannelList(dt,Convert.ToInt32(drv[
"MenuID"]), layer);   
             }
   
         }

        
protected void ddlChannelList_SelectedIndexChanged(object sender, EventArgs e)
        
{
            Response.Write(
"值为:"+this.ddlChannelList.SelectedValue+"--文本内容  为"+this.ddlChannelList.SelectedItem.Text.Trim());
        }

}

 

posted @ 2009-11-30 14:44  自由精灵  阅读(499)  评论(0编辑  收藏  举报