数据表1张,如下:C#代码aspx代码:
<asp:Repeater ID="bClass" runat="server">
 <ItemTemplate>
      <li class="expandable"><div class="hitarea expandable-hitarea "></div><strong>                 <%#Eval("DepartmentName")%></strong></a> 
                          <ul style="display: none; ">
                         </ul>
       </li>
 </ItemTemplate>
</asp:Repeater>后台代码:
namespace test
{
    public partial class WebForm7 : System.Web.UI.Page
    {
        DataSet data = new DataSet();
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt = GetList("select * from OA_GoodType").Tables[0];
            this.bClass.DataSource = GetTreeList(dt, "ID", "Pid", 0);
            bClass.DataBind();//subCate是Repeater控件  
        }        public DataSet GetList(string sql)
        {
            SqlConnection cnn = new SqlConnection("server=192.168.11.221;uid=sa;pwd=123;database=test;");
            SqlDataAdapter cmd1 = new SqlDataAdapter(sql, cnn);
            DataSet ds = new DataSet();
            cmd1.Fill(ds, "GoodType");
            return ds;
        }
        /// <summary>    
        /// dt 要从中生成树状数据源    
        /// IdField ID字段列名    
        /// ParentField 父级ID列名    
        /// Pid 父级ID值    
        /// OrderField 排序字段    
        /// </summary>  
        public DataTable GetTreeList(DataTable dt, string IdField, string ParentField, int Pid)
        {
            DataTable newDT = dt.Clone();// 克隆dt 的结构,包括所有 dt 架构和约束,并无数据;  
            DataRow[] rows;
            /* 
             * 如果父级pid等于本ID时表示顶级分类的情况 用以下语句 
            */
            if (Pid == 0)//选出顶级的类别  
            {
                rows = dt.Select(ParentField + "=" + 0); // 从dt 中查询符合条件的记录(选出所有大类);  
            }
            else//选出属于所传ID的子类  
            {
                rows = dt.Select(ParentField + "<>" + IdField + " and " + ParentField + "=" + Pid); // 从dt 中查询符合条件的记录(选出大类pid的子类);  
                 
            }
            /* 
             * 如果父ID为0的时候表示顶级分类,用以下语句 
             * rows = dt.Select(ParentField + "=" + Pid, OrderField);  
            */
            if (rows.Length > 0)
            {
                foreach (DataRow row in rows)  // 将查询的结果添加到dt中;  
                {
                    newDT.Rows.Add(row.ItemArray);
                    int innerpid = int.Parse(row["id"].ToString());
                    DataRow[] Childows = dt.Select(ParentField + "<>" + IdField + " and " + ParentField + "=" + innerpid);//选出子类  
                    if (Childows.Length > 0)//如果存在子类,对子类进行递归  
                    {
                        DataTable innerDT = GetTreeList(dt, IdField, ParentField, innerpid);//获取子类DataTable  
                        foreach (DataRow innerrow in innerDT.Rows)//对子类的DataTable添加进总数据源  
                        {
                            newDT.Rows.Add(innerrow.ItemArray);
                        }
                    }
                }
            }
            return newDT;
        }   
    }
}运行后的结果:
疑问:
为什么运行后不是成树形、子父关系显示?????各位大侠帮帮忙看看那里有问题?????这问题已困扰我一天了

解决方案 »

  1.   

           /// <summary>
            /// 从内存中取得所有下级栏目列表(自身迭代)
            /// </summary>
            private void GetChannelChild(DataTable oldData, DataTable newData, int PId, int KId)
            {
                DataRow[] dr = oldData.Select("parent_id=" + PId);
                for (int i = 0; i < dr.Length; i++)
                {
                    //添加一行数据
                    DataRow row = newData.NewRow();
                    row["id"] = int.Parse(dr[i]["id"].ToString());
                    row["title"] = dr[i]["title"].ToString();
                    row["parent_id"] = int.Parse(dr[i]["parent_id"].ToString());
                    row["class_list"] = dr[i]["class_list"].ToString();
                    row["class_layer"] = int.Parse(dr[i]["class_layer"].ToString());
                    row["sort_id"] = int.Parse(dr[i]["sort_id"].ToString());
                    row["page_url"] = dr[i]["page_url"].ToString();
                    row["kind_id"] = int.Parse(dr[i]["kind_id"].ToString());
                    newData.Rows.Add(row);
                    //调用自身迭代
                    this.GetChannelChild(oldData, newData, int.Parse(dr[i]["id"].ToString()), KId);
                }
            }