看到网上有很多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());
}
}
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());
}
}