数据表结构
id  parentid typename
1   1        湖北
2   2        广州
3   3        湖南
4   1        武汉
5   1        黄石
6   2        广州
7   6        天河
8   6        白云
...id=parentid 为最大类,没有“深度”字段,
做成无限极下来框该如何绑定?

解决方案 »

  1.   

    绑定还是那也绑定,只是查询的时候你用Parenetid=id就可以了。
    例如:
    select * from
    tablename where parentid=页面上的当前ID
      

  2.   

    使用DropDownList绑定吗?
    使用两个实现二级联动
      

  3.   

    楼主可否换下思路,无限级理论是可以的!但是实现UI时需要确定控件的个数,可以初始化10个控件放在页面上,需要绑定时再显示。
    一般三到四级够了吧。否则你的业务逻辑设计有缺陷。呵呵
    用UpdatePanel应该可以实现无刷新
      

  4.   

    贴一段
     /// <summary>
        /// 绑定分类下拉列表
        /// </summary>
        private void BindDropDownList()
        {
            this.TParentCate.Items.Add(new ListItem("◇根目录", "0"));
            BindDropListByList(UCTreeKMCate1.ThisDataSource);
            
        }
        /// <summary>
        /// List<T>里过滤根基点
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private bool FindMatch(KnowlegeCate m)
        {
            if (m.ParentID == 0)
            {
                return true;
            }
            return false;
        }    /// <summary>
        /// 按层次绑定下拉框
        /// </summary>
        /// <param name="mList"></param>
        /// <param name="mPCateID"></param>
        private void BindDropListByList(List<KnowlegeCate> mList)
        {
            string chrFlag = "┆┄◇";
            List<KnowlegeCate> list = mList.FindAll(FindMatch);
            foreach (KnowlegeCate m in list)
            {
                this.TParentCate.Items.Add(new ListItem(chrFlag + m.CateName, m.CateID.ToString()));
                RecursionBind(mList, m.CateID, ref chrFlag);
            }
        }    private void RecursionBind(List<KnowlegeCate> mList,int mCateID,ref string chr)
        {
            foreach (KnowlegeCate m in mList)
            {
                if (m.ParentID == mCateID)
                {
                    chr = "┆┄" + chr;
                    this.TParentCate.Items.Add(new ListItem(chr + m.CateName, m.CateID.ToString()));
                    RecursionBind(mList, m.CateID, ref chr);
                }
                
            }
            chr = "┆┄◇";    }
      

  5.   

    这里应该javascript向页面中写html代码来实现。因为我们不确定到底有都少级。都以单选择的时候,先去数据库中查找是否有parentid为选中项的id的,若有,过滤出来,然后根据结果组织html代码,然后把组织的html码注入到页面中。
      

  6.   

    用js,如果有下级再创建一个dropdownlist,如何类推下去
      

  7.   

    13楼的我都不知道你的mList是什么数据..
      

  8.   

    是List<KnowlegeCate>,KnowlegeCate是个实体类
      

  9.   

    写了一个DataTable数据源的
    dropdownlist ID:AreaSource
    public partial class _Default : System.Web.UI.Page
    {
        DataView dv;
        /// <summary>
        /// 层次分割符
        /// </summary>
        const string STR_TREENODE = "┆┄";
        /// <summary>
        /// 顶级父节点parentid
        /// </summary>
        const int INT_TOPID = 0;    const string STR_ID = "id";
        const string STR_PARENTID = "parentid";
        const string STR_DISPLAYNAME = "typename";    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dv = new DataView(this.AreaSource);
                dv.Sort = STR_PARENTID;
                string schar = STR_TREENODE;
                if (dv.Table.Rows.Count > 0)
                {
                    RecursBind(INT_TOPID, ref schar);
                }
            }
        }    /// <summary>
        /// 递归绑定DropDownList
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="schar"></param>
        private void RecursBind(int pid,ref string schar)
        {
            
            DataRowView[] rows = dv.FindRows(pid);
            if (rows.Length == 0) schar = STR_TREENODE;
            foreach (DataRowView row in rows)
            {
                if (pid != 0)          
                {
                    schar += STR_TREENODE;
                }
                this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                //Response.Write(schar + row[STR_DISPLAYNAME].ToString() + "<br>");
                RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
            }
        }    /// <summary>
        /// 测试数据源
        /// </summary>
        private DataTable AreaSource
        {
            get {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));            dt.Rows.Add(new object[] { 1, 0, "湖北" });
                dt.Rows.Add(new object[] { 2, 0, "江苏" });
                dt.Rows.Add(new object[] { 3, 0, "浙江" });
                dt.Rows.Add(new object[] { 4, 1, "黄冈" });
                dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
                dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
                dt.Rows.Add(new object[] { 7, 3, "杭州" });
                dt.Rows.Add(new object[] { 8, 2, "南京" });
                return dt;
            }
        }
    }
    输出:
    ┆┄湖北
    ┆┄┆┄黄冈
    ┆┄┆┄┆┄黄冈镇级
    ┆┄┆┄┆┄┆┄黄冈村
    ┆┄江苏
    ┆┄┆┄南京
    ┆┄浙江
    ┆┄┆┄杭州
      

  10.   

     public  void CreateLevelDropDown(DropDownList ddlst, DataTable dt,string strFirstName,string strPrtID,string strColID,string strColName)
        {
          
            System.Collections.ArrayList allItems = new ArrayList();
            if (strFirstName != "")
            {
                ListItem newItem = new ListItem(strFirstName, "");
                allItems.Add(newItem);
            }
            
            DataRow[] rows = dt.Select(strPrtID + " = ''");
            foreach (DataRow row in rows)
                CreateLevelDropDownAssistant(dt, ref   allItems, row, "--", strPrtID, strColID, strColName);
            
            ListItem[] items = new ListItem[allItems.Count];
            allItems.CopyTo(items);
            ddlst.Items.AddRange(items);
        }
        public void CreateLevelDropDownAssistant(DataTable dt, ref   ArrayList items, DataRow parentRow, string curHeader, string strPrtID, string strColID, string strColName)
        {
            ListItem newItem = new ListItem(curHeader + parentRow[strColName].ToString(), parentRow[strColID].ToString());
            items.Add(newItem);
            parentRow.Delete();        DataRow[] rows = dt.Select(strPrtID+" = '" + newItem.Value + "'");
            for (int i = 0; i < rows.Length - 1; i++)
                CreateLevelDropDownAssistant(dt, ref   items, rows[i], curHeader.Replace("┣", "┃").Replace("┗", "┣") + "┣",strPrtID,strColID,strColName);        if (rows.Length > 0)
                CreateLevelDropDownAssistant(dt, ref   items, rows[rows.Length - 1], curHeader.Replace("┣", "┃").Replace("┗", "┣") + "┗",strPrtID,strColID,strColName);
        }
        #endregion
      

  11.   

    调试了一下19楼的,确实没问题,但我的最大类不是parentid==0;
    最大类是parentid==id有点小问题
      

  12.   

    根类的parentid 还是=0好,不然你怎么判断是不是根节点呢
    好像有点麻烦啊
      

  13.   

    我也来写一下
    public partial class UserWebControl_ctlTradeType : System.Web.UI.UserControl
    {
        string toadd = null;    protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            GetTradeType("0");
        }    protected void Page_Load(object sender, EventArgs e)
        {    }    public string SelectedValue
        {
            get { return ddlTradeType.SelectedValue; }
            set { ddlTradeType.SelectedValue = value; }
        }
        private void GetTradeType(string pid)
        {
            DAL.DBAccess db = DAL.DBConnection.CreateDB();
            DataTable dt = db.ExecuteQuery("select * from P_TradeType where parentId=" + pid);
            foreach (DataRow row in dt.Rows)
            {
                string name = row["TName"].ToString();
                string id = row["ID"].ToString();
                this.ddlTradeType.Items.Add(new ListItem(toadd + " " + row["TName"].ToString(), row["ID"].ToString()));
                toadd += "┴─";
                this.GetTradeType(row["id"].ToString());
                toadd = toadd.Substring(0, toadd.Length - 2);  //处理层次关系显示
            }
        }
    }
      

  14.   

    偶用js写了一个
    楼主要的话给我消息QQ 289184118
      

  15.   

    依照你的要求改了一下
     public partial class Default : System.Web.UI.Page
        {
            DataView dv;
            /// <summary>
            /// 层次分割符
            /// </summary>
            const string STR_TREENODE = "┆┄";
            const string STR_ID = "id";
            const string STR_PARENTID = "parentid";
            const string STR_DISPLAYNAME = "typename";        protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    dv = new DataView(this.AreaSource);
                    dv.Sort = STR_PARENTID;
                    string schar = STR_TREENODE;
                    if (dv.Table.Rows.Count > 0)
                    {
                        RecursBind(-1,ref schar);
                    }
                }
            }        /// <summary>
            /// 递归绑定DropDownList
            /// </summary>
            /// <param name="pid"></param>
            /// <param name="schar"></param>
            private void RecursBind(int pid,ref string schar)
            {
                if (pid == -1)
                {
                    foreach (DataRow row in dv.Table.Rows)
                    {
                        if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
                        {
                            this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                            RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
                        }
                    }
                }
                else
                {
                    DataRowView[] rows =  dv.FindRows(pid);
                    foreach (DataRowView row in rows)
                    {
                        if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
                        {
                            schar += STR_TREENODE;
                            this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                            RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
                        }
                        
                    }
                    schar = STR_TREENODE;
                }
            }        /// <summary>
            /// 测试数据源
            /// </summary>
            private DataTable AreaSource
            {
                get
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
                    dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
                    dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));                dt.Rows.Add(new object[] { 1, 1, "湖北" });
                    dt.Rows.Add(new object[] { 2, 2, "江苏" });
                    dt.Rows.Add(new object[] { 3, 3, "浙江" });
                    dt.Rows.Add(new object[] { 4, 1, "黄冈" });
                    dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
                    dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
                    dt.Rows.Add(new object[] { 7, 3, "杭州" });
                    dt.Rows.Add(new object[] { 8, 2, "南京" });
                    return dt;
                }
            }
        }
      

  16.   


    /// <summary>
        /// 递归绑定DropDownList
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="schar"></param>
        private void RecursBind(int pid, ref string schar, DropDownList dp)
        {
            if (pid == -1)
            {
                foreach (DataRow row in dv.Table.Rows)
                {
                    if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
                    {
                        dp.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                        RecursBind(Convert.ToInt32(row[STR_ID]), ref schar,dp);
                    }
                }
            }
            else
            {
                DataRowView[] rows = dv.FindRows(pid);
                foreach (DataRowView row in rows)
                {
                    if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
                    {
                        schar += STR_TREENODE;
                        dp.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                        RecursBind(Convert.ToInt32(row[STR_ID]), ref schar, dp);
                    }            }
                schar = STR_TREENODE;
            }
        }
      

  17.   

    你的数据是不是有问题,下面是我做的5级测试数据,没问题
    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Xml;
    using System.IO;
    using System.Reflection;
    using System.Net;
    public partial class Default5 : System.Web.UI.Page
    {
        DataView dv;
        /// <summary>
        /// 层次分割符
        /// </summary>
        const string STR_TREENODE = "┆┄";
        const string STR_ID = "id";
        const string STR_PARENTID = "parentid";
        const string STR_DISPLAYNAME = "typename";    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dv = new DataView(this.AreaSource);
                dv.Sort = STR_PARENTID;
                string schar = STR_TREENODE;
                if (dv.Table.Rows.Count > 0)
                {
                    RecursBind(-1, ref schar);
                }
            }
        }    /// <summary>
        /// 递归绑定DropDownList
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="schar"></param>
        private void RecursBind(int pid, ref string schar)
        {
            if (pid == -1)
            {
                foreach (DataRow row in dv.Table.Rows)
                {
                    if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
                    {
                        this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                        RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
                    }
                }
            }
            else
            {
                DataRowView[] rows = dv.FindRows(pid);
                foreach (DataRowView row in rows)
                {
                    if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
                    {
                        schar += STR_TREENODE;
                        this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                        RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
                    }            }
                schar = STR_TREENODE;
            }
        }    /// <summary>
        /// 测试数据源
        /// </summary>
        private DataTable AreaSource
        {
            get
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));            dt.Rows.Add(new object[] { 1, 1, "湖北" });
                dt.Rows.Add(new object[] { 2, 2, "江苏" });
                dt.Rows.Add(new object[] { 3, 3, "浙江" });
                dt.Rows.Add(new object[] { 4, 1, "黄冈" });
                dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
                dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
                dt.Rows.Add(new object[] { 7, 3, "杭州" });
                dt.Rows.Add(new object[] { 8, 2, "南京" });
                dt.Rows.Add(new object[] { 9, 6, "黄冈村下级" });
                dt.Rows.Add(new object[] { 10, 7, "杭州区" });
                dt.Rows.Add(new object[] { 11, 8, "南京区" });
                dt.Rows.Add(new object[] { 12, 11, "南京区下级" });
                dt.Rows.Add(new object[] { 13, 12, "南京区下级的下级" });
                return dt;
            }
        }
    }
      

  18.   

    /// <summary>
        /// 测试数据源
        /// </summary>
        private DataTable AreaSource
        {
            get
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));            dt.Rows.Add(new object[] { 1, 1, "湖北" });
                dt.Rows.Add(new object[] { 2, 1, "武汉" });
                dt.Rows.Add(new object[] { 3, 2, "汉口" });
                dt.Rows.Add(new object[] { 4, 2, "汉阳" });
                dt.Rows.Add(new object[] { 5, 4, "蔡甸" });
                dt.Rows.Add(new object[] { 6, 4, "汉南" });
                dt.Rows.Add(new object[] { 7, 1, "黄冈" });
                dt.Rows.Add(new object[] { 8, 7, "黄冈镇级" });
                dt.Rows.Add(new object[] { 9, 7, "黄冈村" });
                dt.Rows.Add(new object[] { 10, 10, "南京" });            return dt;
            }
        }
    我的数据是有两个三级分类就会只显示出一条来,其他的三级都在二级下
      

  19.   

    漏洞在超过第二个分类的数据超过两条以上只会显示出一条正常数据,其他的都在二级分类里面
    private DataTable AreaSource
        {
            get
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
                dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));            dt.Rows.Add(new object[] { 1, 1, "湖北" });
                dt.Rows.Add(new object[] { 2, 2, "江苏" });
                dt.Rows.Add(new object[] { 3, 3, "浙江" });
                dt.Rows.Add(new object[] { 4, 1, "黄冈" });
                dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
                dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
                dt.Rows.Add(new object[] { 7, 3, "杭州" });
                dt.Rows.Add(new object[] { 8, 2, "南京" });
                dt.Rows.Add(new object[] { 9, 6, "黄冈村下级" });
                dt.Rows.Add(new object[] { 10, 7, "杭州区" });
                dt.Rows.Add(new object[] { 11, 8, "南京区" });
                dt.Rows.Add(new object[] { 12, 11, "南京区下级1" });
                dt.Rows.Add(new object[] { 13, 11, "南京区下级2" });
                dt.Rows.Add(new object[] { 14, 12, "南京区下级1的下级" });
                return dt;
            }
        }”南京区下级2“ 就会有问题
      

  20.   

    /// <summary>
        /// 递归绑定DropDownList
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="schar"></param>
        private void RecursBind(int pid, ref string schar)
        {
            
            if (pid == -1)
            {
                foreach (DataRow row in dv.Table.Rows)
                {
                    if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
                    {
                        this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
                        Response.Write(schar + row[STR_DISPLAYNAME].ToString()+"<br>");
                        RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
                    }
                }
            }
            else
            {
               
                DataRowView[] rows = dv.FindRows(pid);
                string temp=null;
                for(int i=0;i<rows.Length;i++)
                {
                    if (Convert.ToInt32(rows[i][STR_ID]) != Convert.ToInt32(rows[i][STR_PARENTID]))
                    {
                        if (temp == null) temp = schar;
                        schar += STR_TREENODE;
                        Response.Write(schar + rows[i][STR_DISPLAYNAME].ToString() + "<br>");
                        this.AreaList.Items.Add(new ListItem(schar + rows[i][STR_DISPLAYNAME].ToString(), rows[i][STR_ID].ToString()));
                        RecursBind(Convert.ToInt32(rows[i][STR_ID]), ref schar);
                        schar = temp;
                    }            }
            }
        }┆┄湖北
    ┆┄┆┄黄冈
    ┆┄┆┄┆┄黄冈镇级
    ┆┄┆┄┆┄┆┄黄冈村
    ┆┄┆┄┆┄┆┄┆┄黄冈村下级
    ┆┄┆┄┆┄┆┄黄冈村二
    ┆┄┆┄┆┄黄冈镇级二
    ┆┄┆┄武汉
    ┆┄江苏
    ┆┄┆┄南京
    ┆┄┆┄┆┄南京区
    ┆┄┆┄┆┄┆┄南京区下级
    ┆┄┆┄┆┄┆┄┆┄南京区下级的下级
    ┆┄浙江
    ┆┄┆┄杭州
    ┆┄┆┄┆┄杭州区
    ┆┄┆┄宁波