这个自定义的C#类可以大大简化GridView的操作,这个C#类定义了一些GridView常用的方法,包括:获取单元格内容、设置单元格内容、从GridView的数据生成DataTable、将集合类转换成DataTable、将泛型集合类转换成DataTable,简单实用。
using System; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Collections; using System.Reflection; namespace DotNet.Utilities { 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; } #endregion } }