我想在下拉列表里显示如下效果:
           大类
               小类1
               小类2
               小类3
          大类2
               小类4
               小类5
          ...
              ...
              ...
不知道该怎么实现,请高手留下数据库设计以及代码实现的思路!谢谢!!

解决方案 »

  1.   

    用递归方法。然后加上缩进格,本人做了一个,参考一下
     /// <summary>
        /// 递归生成
        /// </summary>
        private void BindDrpNode()
        {
            DataTable drs = _categoryBLL.QueryAll();//从数据库获取分类
            foreach (DataRow dr in drs.Rows)
            {
                string id = dr["FullTrail"].ToString();
                string name;
                if (id.Length == 2)//是父类
                {
                    name = dr["CategoryName"].ToString();
                }
                else //子类
                {
                    //生成缩进空格
                    string strName = string.Empty;
                    for (int i = 0; i < id.Length; i++)
                        strName += Server.HtmlDecode("&nbsp;");                name = strName + "|--" + dr["CategoryName"].ToString();
                }
                DDL.Items.Add(new ListItem(name, id));
                BindDrpNode(id);
            }
        }
      

  2.   

    数据表设计
    id pid name
      

  3.   

    单纯代码实现
    /// <summary>
        /// 下拉列表填充 递归
        /// </summary>
        /// <param name="dp">下拉列表</param>
        /// <param name="Table">操作表</param>
        /// <param name="Value">绑定的ID</param>
        /// <param name="Text">绑定的Text</param>
        /// <param name="WhereField">递归字段</param>
        /// <param name="WhereValue">递归值</param>
        /// <param name="WhereOther">其他条件</param>
        /// <param name="SelectValue_Judge">是否有选定的值 0:没有;1:有</param>
        /// <param name="SelectedValue">选定的ID</param>
        /// <param name="HeadSelect_Judge">是否绑定前设定一个值 0:没有;1:有</param>
        /// <param name="HeadSelectValue">设定的ID</param>
        /// <param name="HeadSelectText">设定的Text</param>
        public static void DropDownListFull(DropDownList dp, String Table, String Value, String Text, String WhereField, String WhereValue, String WhereOther, String SelectValue_Judge, String SelectedValue, String HeadSelect_Judge, String HeadSelectValue, String HeadSelectText)
        {
            if (HeadSelect_Judge == "1")
            {
                dp.AppendDataBoundItems = true;
                dp.Items.Add(new ListItem(HeadSelectText, HeadSelectValue));
            }
            string strsql = "select " + Value + "," + Text + " from " + Table + " where " + WhereField + "=" + WhereValue + " and " + WhereOther;
            DataSet ds = cldataset.ReTurnDataSet(strsql);
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                ListItem li = new ListItem();
                li.Text = "╋ " + ds.Tables[0].Rows[i][Text].ToString();
                li.Value = ds.Tables[0].Rows[i][Value].ToString();
                dp.Items.Add(li);
                DropDownListFull_Mx(dp, Table, Value, Text, WhereField, li.Value, WhereOther, "├");
            }
            if (SelectValue_Judge == "1")
            {
                dp.SelectedValue = SelectedValue;
            }
        }
        public static void DropDownListFull_Mx(DropDownList dp, String Table, String Value, String Text, String WhereField, String WhereValue, String WhereOther, String HeadChar)
        {
            string strsql = "select " + Value + "," + Text + " from " + Table + " where " + WhereField + "=" + WhereValue + " and " + WhereOther;
            DataSet ds = cldataset.ReTurnDataSet(strsql);
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                ListItem li = new ListItem();
                li.Text = HeadChar + " " + ds.Tables[0].Rows[i][Text].ToString();
                li.Value = ds.Tables[0].Rows[i][Value].ToString();
                dp.Items.Add(li);
                string HeardChar1 = HeadChar + "─";
                DropDownListFull_Mx(dp, Table, Value, Text, WhereField, li.Value, WhereOther, HeardChar1);
            }
        }
      

  4.   

    如果只是两层的话 YYControls.dll不错
    你可以去看看
    http://www.cnblogs.com/webabcd/archive/2008/01/03/1024977.html
      

  5.   


     /// <summary>
        /// 获取父ID
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (Session["u"] != null)
            {
                T_Users u = Session["u"] as T_Users;
                string name = Session["u"].ToString();
                string userid = bbs.GetByUserId(u.UserName.ToString());
                string pid = DropDownList1.SelectedValue;//获取副版块的值
                DataSet ds = fa.getfu(pid);
                if (pid != "")
                {
                    //是否有子版块
                    //DataSet ds = fa.getfu(pid);
                    if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                    {
                        DropDownList2.Visible = true;//显示子版块的下拉控件
                        //DropDownList2.DataSource = fa.getfu("");
                        DropDownList2.DataSource = ds;
                        DropDownList2.DataTextField = "BigPageName";
                        DropDownList2.DataValueField = "PageId";
                        DropDownList2.DataBind();
                        DropDownList2.Items.Insert(0, new ListItem("--请选择子板块--", ""));
                    }
                    else
                    {
                        //如果没有子版块就隐藏子版块列表
                        DropDownList2.Visible = false;//否则设置为隐藏
                    }            }
                else
                {
                    DropDownList2.Items.Clear();
                    DropDownList2.Items.Insert(0, new ListItem("--请选择子板块--", ""));
                }
            }    }
      

  6.   


    BindDrpNode(id);
    不懂这个。
      

  7.   


    哥,
    session["u"]是什么啊?
      

  8.   


    public class DDLDepartment : DropDownList
      {
        
      public DDLDepartment()
      {
      bind(this, 0);
      this.Items.Insert(0, new ListItem("==请选择==", ""));
      }  public void bind(DropDownList ddlDepartment, int parent)
      {
      IList<Department> deptlist = DepartmentBLL.SelectChild(parent);
      foreach (Department dept in deptlist)
      {
      string text = new string(' ', dept.Depth - 1);
      text += "└" + dept.DeptName;
      ddlDepartment.Items.Add(new ListItem(text, dept.DeptId.ToString()));
      bind(this, dept.DeptNo);
      }
        
      }
      }
      

  9.   

     private void Bind()
        {
            #region 测试数据
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("parentId", typeof(int));        DataRow row = dt.NewRow();
            row["id"] = 1;
            row["name"] = "一级";
            row["parentId"] = 0;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 2;
            row["name"] = "科技";
            row["parentId"] = 1;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 3;
            row["name"] = "沈阳";
            row["parentId"] = 2;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 4;
            row["name"] = "二级";
            row["parentId"] = 0;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 5;
            row["name"] = "美食";
            row["parentId"] = 4;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 6;
            row["name"] = "哈尔滨";
            row["parentId"] = 5;
            dt.Rows.Add(row);        row = dt.NewRow();
            row["id"] = 7;
            row["name"] = "技术";
            row["parentId"] = 1;
            dt.Rows.Add(row);
            #endregion        foreach (DataRow r in dt.Rows)
            {
                if (int.Parse(r["parentId"].ToString()) == 0)
                {
                    int level = 0;
                    string text = r["name"].ToString();
                    ListItem item = new ListItem(text, r["name"].ToString());
                    this.DropDownList1.Items.Add(item);                ChildLoad(r, dt, level+1);
                }
            }        ListItem item1 = new ListItem("请选择选项");
            this.DropDownList1.Items.Insert(0, item1);
        }    private void ChildLoad(DataRow dr, DataTable dt, int level)
        {
            foreach (DataRow r in dt.Rows)
            {
                if (int.Parse(r["parentId"].ToString()) == int.Parse(dr["id"].ToString()))
                {
                    string text = "";
                    for (int i = 0; i < level; i++)
                    {
                        text += System.Web.HttpUtility.HtmlDecode("&nbsp;&nbsp;&nbsp;&nbsp;");  //在dropdownlist的每一项前加空格 
                    }
                    text += "├";
                    text += r["name"].ToString();
                    ListItem item = new ListItem(text, r["name"].ToString());
                    this.DropDownList1.Items.Add(item);                ChildLoad(r, dt, level+1);
                }
            }
        }
      

  10.   


    这是我接收的 用户登录的  session
    你不用管    可以忽略   你看你需要的部分