DropdownList下拉式菜单,无限分类的
分类A
├分类A1
分类B
├分类B1
│├分类B2
高手帮忙啊!!
数据库设计(ACCESS或SQL都可以啊)
classid自动编号
pid   数字      
classname文本  分类名称后台有个添加页面,
前台DropdownList下拉式菜单,无限分类的望CSDN的大虾帮忙啊!!!!那位大哥能不能给个详细的代码啊。。
求求CSDN的大哥们拉
急用啊。。毕业论文用啊!!!!
我上次的毕业论文被打下来了啊!!!

解决方案 »

  1.   

    <form id="Form1" method="post" runat="server">
    <asp:DropDownList id="DropDownList1" runat="server" Width="360px"></asp:DropDownList>
    </form>
    ========================================================
    public class 模拟分级显示的下拉框 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DropDownList DropDownList1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
    DataTable myData = this.CreateTestData();

    CreateLevelDropDown(this.DropDownList1,myData);
    }
    } /// <summary>
    /// 模拟一些测试数据,应用时改为从数据库读取
    /// </summary>
    /// <returns></returns>
    private DataTable CreateTestData()
    {
    DataTable dt = new DataTable();
    dt.Columns.Add("ID",typeof(string));
    dt.Columns.Add("ParentID",typeof(string));
    dt.Columns.Add("TypeName",typeof(string));
    dt.Rows.Add(new object[]{1,0,"一级分类"});//假定顶级节点只有一个,并且ParentID为0
    dt.Rows.Add(new object[]{2,1,"二级分类1"});
    dt.Rows.Add(new object[]{3,1,"二级分类2"});
    dt.Rows.Add(new object[]{4,3,"三级分类2"});
    dt.Rows.Add(new object[]{5,1,"二级分类3"});
    dt.Rows.Add(new object[]{6,5,"三级分类3"});
    dt.Rows.Add(new object[]{7,6,"四级分类3"});
    dt.Rows.Add(new object[]{8,3,"三级AAAA"});
    dt.Rows.Add(new object[]{9,3,"三级BBBB"});
    dt.Rows.Add(new object[]{10,1,"二级ZZZZ"});

    dt.AcceptChanges();
    return dt;
    } /// <summary>
    /// 创建分级下拉框
    /// </summary>
    private void CreateLevelDropDown(DropDownList ddlst,DataTable dt)
    {
    System.Collections.ArrayList allItems = new ArrayList();
    DataRow[] rows = dt.Select("[ParentID]='0'");
    foreach(DataRow row in rows)
    CreateLevelDropDownAssistant(dt,ref allItems,row,string.Empty); ListItem[] items = new ListItem[allItems.Count];
    allItems.CopyTo(items);
    ddlst.Items.AddRange(items);
    }
    private void CreateLevelDropDownAssistant(DataTable dt,ref ArrayList items,DataRow parentRow,string curHeader)
    {
    ListItem newItem = new ListItem(curHeader+parentRow["TypeName"].ToString(),parentRow["ID"].ToString());
    items.Add(newItem);
    parentRow.Delete(); DataRow[] rows = dt.Select("[ParentID]='"+newItem.Value+"'");
    for(int i=0;i<rows.Length-1;i++)
    CreateLevelDropDownAssistant(dt,ref items,rows[i],curHeader.Replace("┣","┃").Replace("┗"," ")+"┣"); if(rows.Length>0)
    CreateLevelDropDownAssistant(dt,ref items,rows[rows.Length-1],curHeader.Replace("┣","┃").Replace("┗",".")+"┗");// foreach(DataRow row in rows)
    // CreateLevelDropDownAssistant(dt,ref items,row,curHeader.Replace("┣","┃")+"┣");
    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
      

  2.   

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Configuration;
    using System.Web;
    using System.Collections;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.Handlers;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page 
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此处放置用户代码以初始化页面
            if (!IsPostBack)
            {
                DataTable myData = this.CreateTestData();            CreateLevelDropDown(this.DropDownList1, myData);
            }
        }    /// <summary>
        /// 模拟一些测试数据,应用时改为从数据库读取
        /// </summary>
        /// <returns></returns>
        private DataTable CreateTestData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("ParentID", typeof(string));
            dt.Columns.Add("TypeName", typeof(string));
            dt.Rows.Add(new object[] { 1, 0, "一级分类" });//假定顶级节点只有一个,并且ParentID为0
            dt.Rows.Add(new object[] { 2, 1, "二级分类1" });
            dt.Rows.Add(new object[] { 3, 1, "二级分类2" });
            dt.Rows.Add(new object[] { 4, 3, "三级分类2" });
            dt.Rows.Add(new object[] { 5, 1, "二级分类3" });
            dt.Rows.Add(new object[] { 6, 5, "三级分类3" });
            dt.Rows.Add(new object[] { 7, 6, "四级分类3" });
            dt.Rows.Add(new object[] { 8, 3, "三级AAAA" });
            dt.Rows.Add(new object[] { 9, 3, "三级BBBB" });
            dt.Rows.Add(new object[] { 10, 1, "二级ZZZZ" });        dt.AcceptChanges();
            return dt;
        }    /// <summary>
        /// 创建分级下拉框
        /// </summary>
        private void CreateLevelDropDown(DropDownList ddlst, DataTable dt)
        {
            System.Collections.ArrayList allItems = new ArrayList();
            DataRow[] rows = dt.Select("[ParentID]='0'");
            foreach (DataRow row in rows)
                CreateLevelDropDownAssistant(dt, ref allItems, row, string.Empty);        ListItem[] items = new ListItem[allItems.Count];
            allItems.CopyTo(items);
            ddlst.Items.AddRange(items);
        }
        private void CreateLevelDropDownAssistant(DataTable dt, ref ArrayList items, DataRow parentRow, string curHeader)
        {
            ListItem newItem = new ListItem(curHeader + parentRow["TypeName"].ToString(), parentRow["ID"].ToString());
            items.Add(newItem);
            parentRow.Delete();        DataRow[] rows = dt.Select("[ParentID]='" + newItem.Value + "'");
            for (int i = 0; i < rows.Length - 1; i++)
                CreateLevelDropDownAssistant(dt, ref items, rows[i], curHeader.Replace("┣", "┃").Replace("┗", " ") + "┣");        if (rows.Length > 0)
                CreateLevelDropDownAssistant(dt, ref items, rows[rows.Length - 1], curHeader.Replace("┣", "┃").Replace("┗", ".") + "┗");        // foreach(DataRow row in rows)
            // CreateLevelDropDownAssistant(dt,ref items,row,curHeader.Replace("┣","┃")+"┣");
        }
        #region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }    /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);    }
        #endregion
    }
    ---------------------------------
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>前台显示页面</title>
    </head>
    <body>
    <form id="Form1" method="post" runat="server">
    <asp:DropDownList id="DropDownList1" runat="server" Width="360px"></asp:DropDownList>
    </form>
    </body>
    </html>
    ----------------------------
    我已经知道做了,但是添加数据分类该怎么做法呢,,大哥!!!
      

  3.   

    后台添加是要C/S的,还是仍然是B/S的??
      

  4.   

    B/S的,我的论文是一个类似网站无限级产品分类添加页面,
    后台一个添加无限分类的,添加程序,
    前台就是和你发给我一样,显示的DropDownList下拉式菜单
    后台添加界面也上DropDownList下拉式的!!!谢谢大哥了!
    这次论文过关就靠你了,谢谢你啦!毕业证就靠,大哥了!!
    谢谢了!!数据库设计(ACCESS或SQL都可以啊)
    classid自动编号
    pid   数字   上一级
    Did   数字 (深度)可省去      
    classname文本  分类名称
    字段名称其他的没事!!!
      

  5.   

    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <TABLE id="Table1" cellSpacing="2" cellPadding="2" width="98%" border="0">
    <TR>
    <TD>
    <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False">
    <SelectedItemStyle BackColor="#FFFF80"></SelectedItemStyle>
    <Columns>
    <asp:ButtonColumn Text="选择" CommandName="Select"></asp:ButtonColumn>
    <asp:BoundColumn DataField="classid" ReadOnly="True" HeaderText="类别编号"></asp:BoundColumn>
    <asp:BoundColumn DataField="classname" ReadOnly="True" HeaderText="类别名称"></asp:BoundColumn>
    <asp:BoundColumn DataField="pid" ReadOnly="True" HeaderText="上级分类编号"></asp:BoundColumn>
    <asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
    </Columns>
    </asp:DataGrid></TD>
    </TR>
    <TR>
    <TD style="HEIGHT: 28px">
    <asp:Button id="btnAdd" runat="server" Text="添加新类"></asp:Button></TD>
    </TR>
    <TR>
    <TD>
    <asp:Panel id="Panel1" runat="server" Width="100%" Enabled="False">
    <TABLE>
    <TR>
    <TD align="right">分类名称:</TD>
    <TD>
    <asp:TextBox id="txtName" runat="server" Width="160px"></asp:TextBox></TD>
    </TR>
    <TR>
    <TD align="right">上级分类:</TD>
    <TD>
    <asp:DropDownList id="DropDownList1" runat="server" Width="165px"></asp:DropDownList></TD>
    </TR>
    <TR>
    <TD align="right">
    <asp:TextBox id="txtID" runat="server" Visible="False"></asp:TextBox></TD>
    <TD>
    <asp:Button id="btnSave" runat="server" Text="保存"></asp:Button></TD>
    </TR>
    </TABLE>
    </asp:Panel></TD>
    </TR>
    </TABLE>
    </FONT>
    </form>
    ================================================================
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
    protected System.Web.UI.WebControls.Panel Panel1;
    protected System.Web.UI.WebControls.Button btnAdd;
    protected System.Web.UI.WebControls.Button btnSave;
    protected System.Web.UI.WebControls.TextBox txtName;
    protected System.Web.UI.WebControls.TextBox txtID;
    protected System.Web.UI.WebControls.DropDownList DropDownList1; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
    this.BindData();
    }
    } private void BindData()
    {
    System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='d:/test.mdb'");
    System.Data.OleDb.OleDbCommand cm = new System.Data.OleDb.OleDbCommand();
    cm.Connection = cnn;
    cm.CommandText = "select classid,pid,classname from ClassTable";
    System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(cm);
    DataTable dt = new DataTable();
    da.Fill(dt);
    cnn.Dispose();
    this.DataGrid1.DataSource = dt;
    this.DataGrid1.DataBind(); CreateLevelDropDown(this.DropDownList1,dt);
    this.btnSave.Text = "保存";
    } /// <summary>
    /// 创建分级下拉框
    /// </summary>
    private void CreateLevelDropDown(DropDownList ddlst,DataTable dt)
    {
    System.Collections.ArrayList allItems = new ArrayList();
    DataRow[] rows = dt.Select("[pID]='0'");
    foreach(DataRow row in rows)
    CreateLevelDropDownAssistant(dt,ref allItems,row,string.Empty); ddlst.Items.Clear();
    ListItem[] items = new ListItem[allItems.Count];
    allItems.CopyTo(items);
    ddlst.Items.AddRange(items);
    ddlst.Items.Insert(0,new ListItem("<- 无 ->","0"));
    }
    private void CreateLevelDropDownAssistant(DataTable dt,ref ArrayList items,DataRow parentRow,string curHeader)
    {
    ListItem newItem = new ListItem(curHeader+parentRow["className"].ToString(),parentRow["classID"].ToString());
    items.Add(newItem);
    parentRow.Delete(); DataRow[] rows = dt.Select("[pID]='"+newItem.Value+"'");
    for(int i=0;i<rows.Length-1;i++)
    CreateLevelDropDownAssistant(dt,ref items,rows[i],curHeader.Replace("┣","┃").Replace("┗"," ")+"┣"); if(rows.Length>0)
    CreateLevelDropDownAssistant(dt,ref items,rows[rows.Length-1],curHeader.Replace("┣","┃").Replace("┗",".")+"┗"); // foreach(DataRow row in rows)
    // CreateLevelDropDownAssistant(dt,ref items,row,curHeader.Replace("┣","┃")+"┣");
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_DeleteCommand);
    this.DataGrid1.SelectedIndexChanged += new System.EventHandler(this.DataGrid1_SelectedIndexChanged);
    this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
    this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void btnAdd_Click(object sender, System.EventArgs e)
    {
    this.txtID.Text =  string.Empty;
    this.txtName.Text = string.Empty;
    this.DropDownList1.SelectedIndex = 0; this.Panel1.Enabled  = true;
    this.btnSave.Text = "保存新类别";
    } private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    this.txtID.Text = this.DataGrid1.SelectedItem.Cells[1].Text;
    this.txtName.Text = this.DataGrid1.SelectedItem.Cells[2].Text;
    this.DropDownList1.SelectedValue = this.DataGrid1.SelectedItem.Cells[3].Text;
    this.Panel1.Enabled = true;
    this.btnSave.Text = "保存所做修改";
    } private void btnSave_Click(object sender, System.EventArgs e)
    {
    if(this.txtName.Text.Trim() == string.Empty)
    {
    Response.Write("<script>alert('请输入类别名称');</script>");
    return;
    } System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='d:/test.mdb'");
    System.Data.OleDb.OleDbCommand cm = new System.Data.OleDb.OleDbCommand();
    cm.Connection = cnn;
    if(this.txtID.Text.Trim() == string.Empty)
    {
    cm.CommandText = "insert into classtable (pid,classname) values (?,?)";
    cm.Parameters.Add("@pid",Convert.ToInt32(this.DropDownList1.SelectedValue));
    cm.Parameters.Add("@classname",this.txtName.Text);
    }
    else
    {
    cm.CommandText = "update classtable set pid=?,classname=? where classid=?";
    cm.Parameters.Add("@pid",Convert.ToInt32(this.DropDownList1.SelectedValue));
    cm.Parameters.Add("@classname",this.txtName.Text);
    cm.Parameters.Add("@classid",Convert.ToInt32(this.txtID.Text));
    } cnn.Open();
    try
    {
    cm.ExecuteNonQuery();
    cnn.Close();
    Response.Write("<script>alert('保存成功!');</script>"); this.BindData();
    this.Panel1.Enabled = false;
    }
    catch(System.Exception ex)
    {
    Response.Write("<script>alert('保存失败!"+ex.Message+"');</script>");
    }
    finally
    {
    cnn.Close();
    cnn.Dispose();
    }
    } private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    //删除功能省略
    }
    }
      

  6.   

    你要的是不是类似这种效果?http://www3.kasdn.cn/SysManage/Category.aspx是的话,加我QQ:45094574。
    有效期一天。