DTcms-【無限級別分類設計】

說重點:遞歸算法實現樹形結構的展示
使用DataTable方式實現
我們分析DAL代碼中的category類 的GetList函數
我再次貼出來  該代碼的功能是 說的頻道下面的所有分類 並按照指定的排序條件排序 
因爲從表中讀取的數據並沒有 “誰歸屬於”所以有一個遞歸的函數

        /// <summary>
        /// 取得所有類別列表
        /// </summary>
        /// <param name="parent_id">父ID</param>
        /// <param name="channel_id">頻道ID</param>
        /// <returns></returns>
        public DataTable GetList(int parent_id, int channel_id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select id,channel_id,title,parent_id,class_list,class_layer,sort_id,link_url,img_url,content,seo_title,seo_keywords,seo_description from dt_category");
            strSql.Append(" where channel_id=" + channel_id + " order by sort_id asc,id desc");
            DataSet ds = DbHelperOleDb.Query(strSql.ToString());
            DataTable oldData = ds.Tables[0] as DataTable;
            if (oldData == null)
            {
                return null;
            }
            //複製結構
            DataTable newData = oldData.Clone();
           
            //調用迭代組合成DAGATABLE
            GetChilds(oldData, newData, parent_id, channel_id);
           
            return newData;
        }

函數如下所示
基本一看就懂,就是所得子分類之後 重寫迭代即可 我將這個代碼修改成了List版本 看下面 因爲List提供的查找的方法更加的強大

        /// <summary>
        /// 從內存中取得所有下級類別列表(自身迭代)
        /// </summary>
        private void GetChilds(DataTable oldData, DataTable newData, int parent_id, int channel_id)
        {
            DataRow[] dr = oldData.Select("parent_id=" + parent_id);
            for (int i = 0; i < dr.Length; i++)
            {
                //添加一行數據
                DataRow row = newData.NewRow();
                row["id"] = int.Parse(dr[i]["id"].ToString());
                row["channel_id"] = int.Parse(dr[i]["channel_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["link_url"] = dr[i]["link_url"].ToString();
                row["img_url"] = dr[i]["img_url"].ToString();
                row["content"] = dr[i]["content"].ToString();
                row["seo_title"] = dr[i]["seo_title"].ToString();
                row["seo_keywords"] = dr[i]["seo_keywords"].ToString();
                row["seo_description"] = dr[i]["seo_description"].ToString();
                newData.Rows.Add(row);
                //調用自身迭代
                this.GetChilds(oldData, newData, int.Parse(dr[i]["id"].ToString()), channel_id);
            }
        }

 List版本的如下

        //List版本的無限分類遞歸算法

        /// <summary>
        /// 取得所有類別列表
        /// </summary>
        /// <param name="parent_id">父ID</param>
        /// <param name="channel_id">頻道ID</param>
        /// <returns></returns>
        public List<DTcms.Model.category> GetListV2(int parent_id, int channel_id)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("select id,channel_id,title,parent_id,class_list,class_layer,sort_id,link_url,img_url,content,seo_title,seo_keywords,seo_description from dt_category");
            strSql.Append(" where channel_id=" + channel_id + " order by sort_id asc,id desc");
            List<DTcms.Model.category> oldData = DataReaderToListV2(DbHelperOleDb.ExecuteReader(strSql.ToString()));

            if (oldData.Count == 0)
            {
                return null;
            }
            List<DTcms.Model.category> newData = new List<DTcms.Model.category>(oldData.Capacity);
            GetChildsV2(oldData, newData, parent_id, channel_id);
            return newData;
        }

        private static List<DTcms.Model.category> DataReaderToListV2(OleDbDataReader read)
        {
            List<DTcms.Model.category> list = new List<DTcms.Model.category>();

            while (read.Read())
            {
                DTcms.Model.category model = new DTcms.Model.category();
                model.id = int.Parse(read["id"].ToString());
                model.channel_id = int.Parse(read["channel_id"].ToString());
                model.title = read["title"].ToString();
                model.parent_id = int.Parse(read["parent_id"].ToString());
                model.class_list = read["class_list"].ToString();
                model.class_layer = int.Parse(read["class_layer"].ToString());
                model.sort_id = int.Parse(read["sort_id"].ToString());
                model.link_url = read["link_url"].ToString();
                model.img_url = read["img_url"].ToString();
                model.content = read["content"].ToString();
                model.seo_title = read["seo_title"].ToString();
                model.seo_keywords = read["seo_keywords"].ToString();
                model.seo_description = read["seo_description"].ToString();
                list.Add(model);
            }
            read.Close();
            return list;
        }

        /// <summary>
        /// 從內存中取得所有下級類別列表(自身迭代)
        /// </summary>
        private void GetChildsV2(List<DTcms.Model.category> oldData, List<DTcms.Model.category> newData, int parent_id, int channel_id)
        {
            oldData.FindAll(delegate(DTcms.Model.category info)
            {
                return (info.parent_id == parent_id);
            }).ForEach(
            delegate(DTcms.Model.category info2)
            {
                newData.Add(info2);
                this.GetChildsV2(oldData, newData, info2.id, channel_id);
            });
        }

看看我就說嘛是不是很簡答啊
直接FindAll出來就行了 好哈哈  簡直就是一行代碼就搞定了 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章