DropDownList无限级分类(灵活控制显示形式)

来源:互联网 发布:让中国儿童也学会编程 编辑:程序博客网 时间:2024/05/22 12:43

数据库设计图:

classid               classname                                            parentid

1 新闻 0 2 国内新闻 1 3 国内看点 1 4 web开发 0 5 asp.net 4 6 社会民生 2 7 C#教程 4 8 百姓生活 6

前台代码:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="ddlClass" runat="server">
        </asp:DropDownList></div>
    </form>
</body>

后台代码:

DB cn = new DB();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindDrpClass();
        }
    }

    #region "绑定顶级分类"
    /// <summary>
    /// 绑定顶级分类
    /// </summary>
    private void BindDrpClass()
    {
        string sql = "select * from tb_Class";
        DataTable dt = cn.ReturnTable2(sql);
        ddlClass.Items.Clear();
        ddlClass.Items.Add(new ListItem("添加根栏目", "0"));
        DataRow[] drs = dt.Select("ParentID= " + 0);

        foreach (DataRow dr in drs)
        {
            string classid = dr["ClassID"].ToString();
            string classname = dr["ClassName"].ToString();
            //顶级分类显示形式
            classname = "╋" + classname;

            ddlClass.Items.Add(new ListItem(classname, classid));
            int sonparentid = int.Parse(classid);
            string blank = "├";
            //递归子分类方法
            BindNode(sonparentid, dt, blank);
        }
        ddlClass.DataBind();
    }
    #endregion

    #region "绑定子分类"
    /// <summary>
    /// 绑定子分类
    /// </summary>
    /// <param name="parentid"></param>
    /// <param name="dt"></param>
    /// <param name="blank"></param>
    private void BindNode(int parentid, DataTable dt, string blank)
    {
        DataRow[] drs = dt.Select("ParentID= " + parentid);

        foreach (DataRow dr in drs)
        {
            string classid = dr["ClassID"].ToString();
            string classname = dr["ClassName"].ToString();

            classname = blank + classname;
            ddlClass.Items.Add(new ListItem(classname, classid));

            int sonparentid = int.Parse(classid);
            string blank2 = blank + "─";

            BindNode(sonparentid, dt, blank2);
        }
    }
    #endregion

DB类的定义(只是简单做测试用的):

public SqlConnection con = new SqlConnection("uid=sa;pwd=;DataBase=test;Server=(local);");

public DataTable ReturnTable2(string sql)
    {
        SqlDataAdapter sda = new SqlDataAdapter(sql, con);
        DataSet ds = new DataSet();
        sda.Fill(ds);

        return ds.Tables[0];
    }