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("\r\n", "").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("\r\n", "").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("\r\n", "").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("\r\n", "").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 } }