zoukankan      html  css  js  c++  java
  • DataTabl 与List 互相转换的 方法,利用反射原理

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace BFKR.Help
    {
        public class GridViewHelper
        {
            #region 私有方法
    
            /// <summary>
            /// 截取内容长度
            /// </summary>
            /// <param name="o_Str">原字符串</param>
            /// <param name="len">截取长度</param>
            /// <returns>截取后字符串</returns>
            private static string GetStrPartly(string o_Str, int len)
            {
                if (len == 0)
                {
                    return o_Str;
                }
                else
                {
                    if (o_Str.Length > len)
                    {
                        return o_Str.Substring(0, len) + "..";
                    }
                    else
                    {
                        return o_Str;
                    }
                }
            }
    
            /// <summary>
            /// 获取单元格内容
            /// </summary>
            /// <param name="cell">TableCell</param>
            /// <returns>内容</returns>
            private static string GetCellText(TableCell cell)
            {
                string text = cell.Text;
                if (!string.IsNullOrEmpty(text))
                {
                    return text;
                }
                foreach (Control control in cell.Controls)
                {
                    if (control != null && control is IButtonControl)
                    {
                        IButtonControl btn = control as IButtonControl;
                        text = btn.Text.Replace("
    ", "").Trim();
                        break;
                    }
                    if (control != null && control is ITextControl)
                    {
                        LiteralControl lc = control as LiteralControl;
                        if (lc != null)
                        {
                            continue;
                        }
                        ITextControl l = control as ITextControl;
                        text = l.Text.Replace("
    ", "").Trim();
                        break;
                    }
                }
                return text;
            }
    
            /// <summary>
            /// 设置单元格内容
            /// </summary>
            /// <param name="cell">TableCell</param>
            /// <param name="maxLen">最大长度</param>
            private static void SetCellText(TableCell cell, int maxLen)
            {
                string text = cell.Text;
                if (!string.IsNullOrEmpty(text))
                {
                    cell.Text = GetStrPartly(text, maxLen);
                }
                foreach (Control control in cell.Controls)
                {
                    if (control != null && control is IButtonControl)
                    {
                        IButtonControl btn = control as IButtonControl;
                        text = btn.Text.Replace("
    ", "").Trim();
                        btn.Text = GetStrPartly(text, maxLen);
                        break;
                    }
                    if (control != null && control is ITextControl)
                    {
                        LiteralControl lc = control as LiteralControl;
                        if (lc != null)
                        {
                            continue;
                        }
                        ITextControl l = control as ITextControl;
                        text = l.Text.Replace("
    ", "").Trim();
                        if (l is DataBoundLiteralControl)
                        {
                            cell.Text = GetStrPartly(text, maxLen);
                            break;
                        }
                        else
                        {
                            l.Text = GetStrPartly(text, maxLen);
                            break;
                        }
                    }
                }
            }
    
            #endregion
    
            #region 公有方法
    
            /// <summary>
            /// 从GridView的数据生成DataTable
            /// </summary>
            /// <param name="gv">GridView对象</param>
            public static DataTable GridView2DataTable(GridView gv)
            {
                DataTable table = new DataTable();
                int rowIndex = 0;
                List<string> cols = new List<string>();
                if (!gv.ShowHeader && gv.Columns.Count == 0)
                {
                    return table;
                }
                GridViewRow headerRow = gv.HeaderRow;
                int columnCount = headerRow.Cells.Count;
                for (int i = 0; i < columnCount; i++)
                {
                    string text = GetCellText(headerRow.Cells[i]);
                    cols.Add(text);
                }
                foreach (GridViewRow r in gv.Rows)
                {
                    if (r.RowType == DataControlRowType.DataRow)
                    {
                        DataRow row = table.NewRow();
                        int j = 0;
                        for (int i = 0; i < columnCount; i++)
                        {
                            string text = GetCellText(r.Cells[i]);
                            if (!String.IsNullOrEmpty(text))
                            {
                                if (rowIndex == 0)
                                {
                                    string columnName = cols[i];
                                    if (String.IsNullOrEmpty(columnName))
                                    {
                                        continue;
                                    }
                                    if (table.Columns.Contains(columnName))
                                    {
                                        continue;
                                    }
                                    DataColumn dc = table.Columns.Add();
                                    dc.ColumnName = columnName;
                                    dc.DataType = typeof(string);
                                }
                                row[j] = text;
                                j++;
                            }
                        }
                        rowIndex++;
                        table.Rows.Add(row);
                    }
                }
                return table;
            }
    
            /// <summary>
            /// 将集合类转换成DataTable
            /// </summary>
            /// <param name="list">集合</param>
            public static DataTable ToDataTable(IList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            object obj = pi.GetValue(list[i], null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
            /// <summary>
            /// 将泛型集合类转换成DataTable
            /// </summary>
            /// <typeparam name="T">集合项类型</typeparam>
            /// <param name="list">集合</param>
            /// <param name="propertyName">需要返回的列的列名</param>
            /// <returns>数据集(表)</returns>
            public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
            {
                List<string> propertyNameList = new List<string>();
                if (propertyName != null) propertyNameList.AddRange(propertyName);
    
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        if (propertyNameList.Count == 0)
                        {
                            result.Columns.Add(pi.Name, pi.PropertyType);
                        }
                        else
                        {
                            if (propertyNameList.Contains(pi.Name)) result.Columns.Add(pi.Name, pi.PropertyType);
                        }
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            if (propertyNameList.Count == 0)
                            {
                                object obj = pi.GetValue(list[i], null);
                                tempList.Add(obj);
                            }
                            else
                            {
                                if (propertyNameList.Contains(pi.Name))
                                {
                                    object obj = pi.GetValue(list[i], null);
                                    tempList.Add(obj);
                                }
                            }
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
    
            public static List<T> DataTableToList<T>(DataTable dt) where T : class, new()
            {
                //定义集合
                List<T> ts = new List<T>();
                //定义一个临时变量
                string tempName = string.Empty;
                //遍历DataTable中所有的数据行
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    //获得此模型的公共属性
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    //遍历该对象的所有属性
                    foreach (PropertyInfo pi in propertys)
                    {
                        tempName = pi.Name;//讲属性名称赋值给临时变量
                        //检查DataTable是否包含此列(列名==对象的属性名)
                        if (dt.Columns.Contains(tempName))
                        {
                            //取值
                            object value = dr[tempName];
                            if (value != DBNull.Value)
                            {
                                pi.SetValue(t, value, null);
                            }
                        }
                    }
                    //对象添加到泛型集合中
                    ts.Add(t);
                }
                return ts;
            }
    
    
            #endregion
        }
    }
  • 相关阅读:
    JSON.parse解决Unexpected token ' in JSON at position 1报错
    angularjs $scope与this的区别,controller as vm有何含义?
    angularjs link compile与controller的区别详解,了解angular生命周期
    理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected失败后依然返回resolved成功结果
    angularjs 一篇文章看懂自定义指令directive
    js 记录几个因惯性思维引发的代码BUG,开发思维方式的自我反省
    js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素
    angularjs ng-if妙用,ng-if解决父子组件异步传值
    JS 从内存空间谈到垃圾回收机制
    Markdown数学公式语法
  • 原文地址:https://www.cnblogs.com/fenger-VIP/p/13618418.html
Copyright © 2011-2022 走看看