zoukankan      html  css  js  c++  java
  • 记录转化为有层次结构的树状列表的通用算法

    问题说明:
    在获取数据库记录数据的时候, 通常返回的ArrayList集合, 没有了层次关系. 如果每次根据PID重新到数据库获取记录, 可以做到, 但有以下几个缺点:
    1. 访问数据库记录次数随着记录的增多而增多
    2. 由于需要多次访问数据库, 因此访问速度受影响
    3. 需要数据库访问层的支持, 并对记录进行转化, 耦合性太强
    4. 通用性不好, 每次需要一个新的类型列表, 就需要重新编写
    解决方法:
    我根据原有的树状结构算法代码, 编写一个通用的算法, 利用反射原理, 递归的对数据进行筛选.
    这样只需要访问数据库一次, 然后就在内存中遍历, 而且适合于所有具有(PID, ID, Name)属性的实体类集合的排序.
     
    如我需要生成设备类型实体类集合的树状结构时候, 代码如下:
    ArrayList equipTypelist = equipmentType.GetAll();
        equipTypelist 
    = CollectionHelper.GetTreeItems(equipTypelist);
        
    this.ddlEquipmentTypes.DataSource = equipTypelist;
        
    this.ddlEquipmentTypes.DataTextField = "Name";
        
    this.ddlEquipmentTypes.DataValueField = "ID";
        
    this.ddlEquipmentTypes.DataBind();

        
    this.ddlEquipmentType.Items.Insert(0new ListItem("(全部)""0"));

        public class CollectionHelper
        
    {            
            
    private static ArrayList Fill(int pID, int level, ArrayList list)
            
    {
                ArrayList returnList 
    = new ArrayList();
                
    foreach(object obj in list)
                
    {
                    
    int typePID = (int)ReflectionUtil.GetProperty(obj, "PID");
                    
    int typeID = (int)ReflectionUtil.GetProperty(obj, "ID");
                    
    string typeName = ReflectionUtil.GetProperty(obj, "Name"as string;

                    
    if(pID == typePID)
                    
    {
                        
    string newName = new string('-', level * 4+ typeName;
                        ReflectionUtil.SetProperty(obj, 
    "Name", newName);
                        returnList.Add(obj);

                        returnList.AddRange(Fill(typeID, level
    +1, list));
                    }

                }

                
    return returnList;
            }


            
    /// <summary>
            
    /// 生成有层次结构的列表
            
    /// </summary>
            
    /// <param name="list">具有Name,ID,PID成员的任何集合</param>
            
    /// <returns></returns>

            public static ArrayList GetTreeItems(ArrayList list)
            
    {
                
    return Fill(-10, list);
            }
        
        }


        public sealed class ReflectionUtil
        
    {
            
    private ReflectionUtil()
            
    { }

            
    public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public |
                BindingFlags.NonPublic 
    | BindingFlags.Instance | BindingFlags.Static;

            
    public static void SetProperty(object obj, string name, object value)
            
    {
                PropertyInfo fi 
    = obj.GetType().GetProperty(name, bf);
                fi.SetValue(obj, value,
    null);
            }


            
    public static object GetProperty(object obj, string name)
            
    {
                PropertyInfo fi 
    = obj.GetType().GetProperty(name, bf);
                
    return fi.GetValue(obj,null);
            }

    }

    效果图如下
    树状列表效果图.jpg
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    ios入门笔记(创建隐式首选项,实现系统设置,实现文件系统存储)
    ios开发(表视图)
    Android上使用OpenglES2.0遇到的一点问题
    Android平台对H264视频硬解码
    Java GC机制和对象Finalize方法的一点总结
    JVM GC之一找出不可达对象并回收
    docker 使用Data Volume 共享文件
    sscanf函数用法详解
    va_start和va_end使用详解
    NDK 的helloworld步奏
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/969454.html
Copyright © 2011-2022 走看看