无限级联下拉菜单

前台 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SelectMenu.aspx.cs" Inherits="SelectMenu" %>

<!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" runat="server">
    <div>
        <table>
            <tr>
                <td>
                    内容</td>
                <td>
                    属性</td>
                <td>
                    列表</td>
                <td>
                    操作</td>
                <td>
                    </td>
            </tr>
            <tr>
                <td>
                    <asp:TextBox ID="txtContent" runat="server"></asp:TextBox></td>
                <td>
                    <asp:CheckBox ID="cbIsFirst" runat="server" Text="主节点" />
                    </td>
                <td>
                    <asp:DropDownList ID="ddlChannels" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlChannels_SelectedIndexChanged">
                    </asp:DropDownList></td>
                <td>
                    <asp:DropDownList ID="ddlOpreat" runat="server">
                        <asp:ListItem Value="Add">添加</asp:ListItem>
                        <asp:ListItem Value="Mod">修改</asp:ListItem>
                        <asp:ListItem Value="Del">删除</asp:ListItem>
                    </asp:DropDownList></td>
                <td>
                    <asp:Button ID="btnOK" runat="server" OnClick="btnOK_Click" Text="应用" /></td>
            </tr>
        </table>
    </div>
   </form>
</body>
</html>


后台

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Data.OleDb;

public partial class SelectMenu : System.Web.UI.Page
{
    //DataTable dt = new DataTable();

//设置连接字符串
    static string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|db_Mis.mdb;";

//建立数据库连接
    static OleDbConnection conn = new OleDbConnection(connstr);
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindDDL();
        }
    }

//执行查询语句,并返回一个DataTable
    public DataTable Query(string sql)
    {
        OleDbCommand cmd = new OleDbCommand(sql, conn);
        OleDbDataAdapter sda = new OleDbDataAdapter(cmd);
        DataTable dt = new DataTable();
        try
        {
            conn.Open();
            sda.Fill(dt);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        finally
        {
            sda.Dispose();
            cmd.Dispose();
            conn.Close();
        }
        return dt;
    }

//返回节点的上级节点Id
    public DataTable GetFather(string FatherId)
    {
        return Query("select * from tb_Channels where Id=" + FatherId);
    }

//返回节点的组号
    public DataTable GetGroupId(string Id)
    {
        string sql;

     //判断主节点
        if (this.cbIsFirst.Checked)
        {

        //获取下一个组号
            sql = "Select MAX(GroupId)+1 from tb_Channels";
        }
        else
        {

        //获取当前节点的组号
            sql = "select GroupId from tb_Channels where Id=" + Id;
        }
        return Query(sql);
    }

//返回所有字段
    public DataTable GetChild()
    {
        return Query("Select * from tb_Channels ORDER BY GroupId,FatherId ASC");
    }

//检查渠道是否存在
    public DataTable Check(string Channel, string FatherId)
    {
        return Query("select * from tb_Channels where Channel='"+Channel+"' and FatherId="+FatherId);
    }

//执行非查询语句
    public void NonQuery(string sql)
    {
        OleDbCommand cmd = new OleDbCommand(sql, conn);
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        finally
        {
            cmd.Dispose();
            conn.Close();
        }
    }

//将数据绑定
    public void BindDDL()
    {
        DataTable dt = GetChild();
        this.ddlChannels.Items.Clear();
        foreach (DataRow dr in dt.Rows)
        {
            ListItem li = new ListItem(str(dr[1].ToString(),dr[2].ToString())+dr[1].ToString(), dr[0].ToString());
            this.ddlChannels.Items.Add(li);
        }
    }
    public string str(string Channel,string FatherId)
    {
        if (FatherId == "0")
        {
            return "";
        }
        else
        {
            DataTable dt = GetFather(FatherId);
            if (dt.Rows.Count > 0)
            {
                Channel = str(dt.Rows[0][1].ToString(), dt.Rows[0][2].ToString()) + dt.Rows[0][1].ToString() + "-->";
                return Channel;
            }
            else
            {
                return "该节点的上级节点被删除-->";
            }
        }
    }

    protected void btnOK_Click(object sender, EventArgs e)
    {
        switch (this.ddlOpreat.SelectedValue)
        {
            case "Add": Add(); break;
            case "Mod": Mod(); break;
            case "Del": Del(); break;
        }
        BindDDL();
    }
    public void Add()
    {
        string Channel = this.txtContent.Text.Trim();
        string FatherId=this.ddlChannels.SelectedValue;
        string Channeled = this.ddlChannels.SelectedItem.Text;
        if(this.cbIsFirst.Checked)
        {
            FatherId="0";
        }
        string GroupId=GetGroupId(FatherId).Rows[0][0].ToString();
        if (string.IsNullOrEmpty(Channel))
        {
            Response.Write("<script>alert('渠道名称不能为空!');</script>");
        }
        else
        {
            DataTable dt = Check(Channel,FatherId);
            if (dt.Rows.Count > 0)
            {
                Response.Write("<script>alert('该渠道名已存在!');</script>");
            }
            else
            {
                NonQuery("insert into tb_Channels(Channel,FatherId,GroupId) values('" + Channel + "'," + FatherId + "," + GroupId + ")");
                this.txtContent.Text = "";
            }
        }
    }
    public void Mod()
    {
        string Channel = this.txtContent.Text.Trim();
        string Id = this.ddlChannels.SelectedValue;
        if (string.IsNullOrEmpty(Channel))
        {
            Response.Write("<script>alert('请输入新的渠道名称!');</script>");
        }
        else
        {
            NonQuery("Update tb_Channel set Channel='" + Channel + "' where Id="+Id);
        }
    }
    public void Del()
    {
        string Id = this.ddlChannels.SelectedValue;
        DataTable dt = GetFather(Id);
        foreach (DataRow dr in dt.Rows)
        {
            if (dr[2].ToString() == "0")
            {
                Response.Write("<script>alert('主节点不能删除!');</script>");
            }
            else
            {
                Response.Write("<script>confirm('您确认要删除该渠道吗?');</script>");
                NonQuery("Delete from tb_Channels where Id=" + Id);
            }
        }
    }
    protected void ddlChannels_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (this.ddlOpreat.SelectedValue == "Mod")
        {
            string str=this.ddlChannels.SelectedItem.Text;
            if(str.Contains("-->"))
            {
                str=str.Substring(str.LastIndexOf("-->")+3);
            }
            this.txtContent.Text = str;
        }
    }
}


数据库结构

数据库结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值