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出来就行了 好哈哈  简直就是一行代码就搞定了 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
美容化妆企业微信小程序官网,后台管理更新微信小程序上数据信息,测试无Bug,感兴趣的欢迎下载 1、 后台内容管理:管理网站的pc和wap端的产品、文章、单页等管理、有多状态(置顶、推荐、热门、评论、幻灯片)设置、附件(压缩包、视频、音频、图片)上传、多图上传管理、拓展字段信息编辑等 2、 后台会员系统:会员列表、会员基本信息,积分明细、余额明细、购物记录、收货地址(在系统设置的频道管理可以开启此功能) 3、 后台订单:订单列表,订单基本信息、订单退款、订单发货 (在系统设置的频道管理可以开启此功能) 4、 后台其他管理:评论管理 、留言管理 、友情链接、广告管理 、 门店管理、图片管理、优惠卷管理 等功能 5、 后台系统设置:导航栏目、分类管理、 OAuth设置 、支付设置、扩展字段 、频道管理、模型管理、站点基本信息等功能设置 6、 后台拓展字段管理:配置网站需要的字段(图片、文本、富文本、时间、多选、单选)在前台进行数据显示(在系统设置的频道管理可以开启此功能) 7、 后台短信管理:管理短信发送、发送日志管理(在系统设置的频道管理可以开启此功能) 8、 后台微信管理:自定义菜单 、文本回复、 图文回复 、关键字回复 、首次关注回复 、 授权设置等(在系统设置的频道管理可以开启此功能) 9、 后台抽奖管理:大转盘抽奖 、刮刮乐抽奖 、 随机抽奖等(在系统设置的频道管理可以开启此功能) 10、后台系统用户管理: 管理员列表、角色管理 、 管理日志等(在系统设置的频道管理可以开启此功能) 11、后台支付管理: 微信支付 、支付宝支付 、 银联支付等(在系统设置的频道管理可以开启此功能)
此旗舰版 修改与 DTcms V5.0 正式版MSSQL源码 更新时间:2017年09月21日 在此版本基础上增加了所有旗 DTcms V5.0 旗舰版功能 经本人测试没测试出问题 如有发现问题可以留言 DTcms V5.0源码说明: 版本号:V5.0.0 数据库:MSSQL2005 修复日志: 2017-06-11 修复前台模板订单结算时地址无法选择BUG 2017-06-12 修复后台管理菜单无法上传图标的BUG 2017-07-09 修复第三方登录出错的BUG 2017-09-20 修复前台会员注册时获取手机验证码短信防止注册机重复发送短信BUG DTcms5.0改进的地方: 1. 后台管理界面加强美化,使用矢量图标代替位图,对于树型菜单增加可闭合和展开,调整了部分页面的布局; 2. 对于会员、订单等进行站点归类,更好区分每个站点数据; 3. 创建频道时,根据选择的功能创建不同的管理菜单; 4. 网页编辑器使用了UEditor百度编辑器,上传进行了改造,使用二进制上传文件; 5. 支付方式,第三方登录OAuth可每个站点设置不同的配置信息,不再限于全局使用; 6. 对系统架构进行全新改造,每增加一个频道自动创建对象数据库表存储; 7. 插件模板支持不同的站点可创建不同的对应模板; 8. DAL层代码改进,通过反射进行解析Model实体自动赋值,不必担心增加数据库字段而修改DAL层烦恼; 二、安装环境要求 开发工具:Microsoft Visual Studio 2010 操作系统:Windows Server 2008(推荐) 、Windows Server 2003(推荐)、Windows XP(基础测试环境) 数据库: Sql Server 2005(推荐)、Sql Server 2008(推荐) Web服务器:IIS 5.0及以上版本(推荐IIS7.0,应用池为集成模式) 环境要求:.NET Framework 4.x及以上

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值