實現效果
- 本輔助類主要是用來方便對DataTable進行相關操作的輔助類,該類是非常常用的工具類,常用與數據顯示、轉換和報表生成等操作中 。
- 提供的操作,包括有創建表、DataTable和實體類集合IList<T>相互轉化、表排序、表過濾等操作,以求達到快速進行DataTable操作的目的。
實現代碼
輔助類提供的方法接口如下所示:
/// <summary>
/// 給DataTable增加一個自增列
/// 如果DataTable 存在 identityid 字段 則 直接返回DataTable 不做任何處理
/// </summary>
public static DataTable AddIdentityColumn(DataTable dt)
/// <summary>
/// 檢查DataTable 是否有數據行
/// </summary>
public static bool IsHaveRows(DataTable dt)
/// <summary>
/// DataTable轉換成實體列表
/// </summary>
public static IList<T> DataTableToList<T>(DataTable table)
/// <summary>
/// 實體列表轉換成DataTable
/// </summary>
public static DataTable ListToDataTable<T>(IList<T> list)
/// <summary>
/// 將泛型集合類轉換成DataTable
/// </summary>
public static DataTable ToDataTable<T>(IList<T> list)
/// <summary>
/// 將泛型集合類轉換成DataTable
/// </summary>
public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
/// <summary>
/// 根據nameList裏面的字段創建一個表格,返回該表格的DataTable
/// </summary>
public static DataTable CreateTable(List<string> nameList)
/// <summary>
/// 通過字符列表創建表字段,字段格式可以是:
/// 1) a,b,c,d,e
/// 2) a|int,b|string,c|bool,d|decimal
/// </summary>
public static DataTable CreateTable(string nameString)
/// <summary>
/// 獲得從DataRowCollection轉換成的DataRow數組
/// </summary>
public static DataRow[] GetDataRowArray(DataRowCollection drc)
/// <summary>
/// 將DataRow數組轉換成DataTable,注意行數組的每個元素須具有相同的數據結構,
/// 否則當有元素長度大於第一個元素時,拋出異常
/// </summary>
public static DataTable GetTableFromRows(DataRow[] rows)
/// <summary>
/// 排序表的視圖
/// </summary>
public static DataTable SortedTable(DataTable dt, params string[] sorts)
/// <summary>
/// 根據條件過濾表的內容
/// </summary>
public static DataTable FilterDataTable(DataTable dt, string condition)
/// <summary>
/// 轉換.NET的Type到數據庫參數的類型
/// </summary>
public static DbType TypeToDbType(Type t)
/// <summary>
/// 使用分隔符串聯表格字段的內容,如:a,b,c
/// </summary>
public static string ConcatColumnValue(DataTable dt, string columnName, string append, char splitChar)
/// <summary>
/// 使用逗號串聯表格字段的內容,如:a,b,c
/// </summary>
public static string ConcatColumnValue(DataTable dt, string columnName, string append)
根據字段創建表對象,多個列用逗號(,)分開,默認爲表對象的列爲string。
string columns = @"訂單編號,支付時間,收貨人,省份,城市,地區,地址,聯繫電話";
DataTable dt = DataTableHelper.CreateTable(columns);
根據字段創建表對象,多個列用逗號(,)分開。如需要制定列的類型,在字段後加上“|int”格式的字符。
string tableColumns = "ID|int,tid,guid,num|int,payment|decimal,Source";
DataTable dt = DataTableHelper.CreateTable(tableColumns);
DataTable對象排序操作SortedTable,可對錶多列進行排序操作。
string where = GetSearchSql();
IList<CustomerInfo> list = BLLFactory<Customer>.Instance.Find(where, this.winGridViewPager1.PagerInfo);
DataTable dt = DataTableHelper.ToDataTable<CustomerInfo>(list);
DataTable dtSort = DataTableHelper.SortedTable(dt, new string[]{"Number asc", "Type desc"});
附上源碼
/// <summary>
/// DataTable操作輔助類
/// </summary>
public class DataTableHelper
{
/// <summary>
/// 給DataTable增加一個自增列
/// 如果DataTable 存在 identityid 字段 則 直接返回DataTable 不做任何處理
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns>返回Datatable 增加字段 identityid </returns>
public static DataTable AddIdentityColumn(DataTable dt)
{
if (!dt.Columns.Contains("identityid"))
{
dt.Columns.Add("identityid");
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i]["identityid"] = (i + 1).ToString();
}
}
return dt;
}
/// <summary>
/// 檢查DataTable 是否有數據行
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static bool IsHaveRows(DataTable dt)
{
if (dt != null && dt.Rows.Count > 0)
return true;
return false;
}
/// <summary>
/// DataTable轉換成實體列表
/// </summary>
/// <typeparam name="T">實體 T </typeparam>
/// <param name="table">datatable</param>
/// <returns></returns>
public static IList<T> DataTableToList<T>(DataTable table)
where T : class
{
if (!IsHaveRows(table))
return new List<T>();
IList<T> list = new List<T>();
T model = default(T);
foreach (DataRow dr in table.Rows)
{
model = Activator.CreateInstance<T>();
foreach (DataColumn dc in dr.Table.Columns)
{
object drValue = dr[dc.ColumnName];
PropertyInfo pi = model.GetType().GetProperty(dc.ColumnName);
if (pi != null && pi.CanWrite && (drValue != null && !Convert.IsDBNull(drValue)))
{
pi.SetValue(model, drValue, null);
}
}
list.Add(model);
}
return list;
}
/// <summary>
/// 實體列表轉換成DataTable
/// </summary>
/// <typeparam name="T">實體</typeparam>
/// <param name="list"> 實體列表</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(IList<T> list)
where T : class
{
if (list == null || list.Count <= 0)
{
return null;
}
DataTable dt = new DataTable(typeof(T).Name);
DataColumn column;
DataRow row;
PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
int length = myPropertyInfo.Length;
bool createColumn = true;
foreach (T t in list)
{
if (t == null)
{
continue;
}
row = dt.NewRow();
for (int i = 0; i < length; i++)
{
PropertyInfo pi = myPropertyInfo[i];
string name = pi.Name;
if (createColumn)
{
column = new DataColumn(name, pi.PropertyType);
dt.Columns.Add(column);
}
row[name] = pi.GetValue(t, null);
}
if (createColumn)
{
createColumn = false;
}
dt.Rows.Add(row);
}
return dt;
}
/// <summary>
/// 將泛型集合類轉換成DataTable
/// </summary>
/// <typeparam name="T">集合項類型</typeparam>
/// <param name="list">集合</param>
/// <returns>數據集(表)</returns>
public static DataTable ToDataTable<T>(IList<T> list)
{
return ToDataTable<T>(list, null);
}
/// <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;
}
/// <summary>
/// 根據nameList裏面的字段創建一個表格,返回該表格的DataTable
/// </summary>
/// <param name="nameList">包含字段信息的列表</param>
/// <returns>DataTable</returns>
public static DataTable CreateTable(List<string> nameList)
{
if (nameList.Count <= 0)
return null;
DataTable myDataTable = new DataTable();
myDataTable.TableName = "tableName";//增加一個默認的名字
foreach (string columnName in nameList)
{
myDataTable.Columns.Add(columnName, typeof(string));
}
return myDataTable;
}
/// <summary>
/// 通過字符列表創建表字段,字段格式可以是:
/// 1) a,b,c,d,e
/// 2) a|int,b|string,c|bool,d|decimal
/// </summary>
/// <param name="nameString"></param>
/// <returns></returns>
public static DataTable CreateTable(string nameString)
{
string[] nameArray = nameString.Split(new char[] { ',', ';' });
List<string> nameList = new List<string>();
DataTable dt = new DataTable();
dt.TableName = "tableName";//增加一個默認的名字
foreach (string item in nameArray)
{
if (!string.IsNullOrEmpty(item))
{
string[] subItems = item.Split('|');
if (subItems.Length == 2)
{
dt.Columns.Add(subItems[0], ConvertType(subItems[1]));
}
else
{
dt.Columns.Add(subItems[0]);
}
}
}
return dt;
}
private static Type ConvertType(string typeName)
{
typeName = typeName.ToLower().Replace("system.", "");
Type newType = typeof(string);
switch (typeName)
{
case "boolean":
case "bool":
newType = typeof(bool);
break;
case "int16":
case "short":
newType = typeof(short);
break;
case "int32":
case "int":
newType = typeof(int);
break;
case "long":
case "int64":
newType = typeof(long);
break;
case "uint16":
case "ushort":
newType = typeof(ushort);
break;
case "uint32":
case "uint":
newType = typeof(uint);
break;
case "uint64":
case "ulong":
newType = typeof(ulong);
break;
case "single":
case "float":
newType = typeof(float);
break;
case "string":
newType = typeof(string);
break;
case "guid":
newType = typeof(Guid);
break;
case "decimal":
newType = typeof(decimal);
break;
case "double":
newType = typeof(double);
break;
case "datetime":
newType = typeof(DateTime);
break;
case "byte":
newType = typeof(byte);
break;
case "char":
newType = typeof(char);
break;
}
return newType;
}
/// <summary>
/// 獲得從DataRowCollection轉換成的DataRow數組
/// </summary>
/// <param name="drc">DataRowCollection</param>
/// <returns></returns>
public static DataRow[] GetDataRowArray(DataRowCollection drc)
{
int count = drc.Count;
DataRow[] drs = new DataRow[count];
for (int i = 0; i < count; i++)
{
drs[i] = drc[i];
}
return drs;
}
/// <summary>
/// 將DataRow數組轉換成DataTable,注意行數組的每個元素須具有相同的數據結構,
/// 否則當有元素長度大於第一個元素時,拋出異常
/// </summary>
/// <param name="rows">行數組</param>
/// <returns></returns>
public static DataTable GetTableFromRows(DataRow[] rows)
{
if (rows.Length <= 0)
{
return new DataTable();
}
DataTable dt = rows[0].Table.Clone();
dt.DefaultView.Sort = rows[0].Table.DefaultView.Sort;
for (int i = 0; i < rows.Length; i++)
{
dt.LoadDataRow(rows[i].ItemArray, true);
}
return dt;
}
/// <summary>
/// 排序表的視圖
/// </summary>
/// <param name="dt"></param>
/// <param name="sorts"></param>
/// <returns></returns>
public static DataTable SortedTable(DataTable dt, params string[] sorts)
{
if (dt.Rows.Count > 0)
{
string tmp = "";
for (int i = 0; i < sorts.Length; i++)
{
tmp += sorts[i] + ",";
}
dt.DefaultView.Sort = tmp.TrimEnd(',');
}
return dt;
}
/// <summary>
/// 根據條件過濾表的內容
/// </summary>
/// <param name="dt"></param>
/// <param name="condition"></param>
/// <returns></returns>
public static DataTable FilterDataTable(DataTable dt, string condition)
{
if (condition.Trim() == "")
{
return dt;
}
else
{
DataTable newdt = new DataTable();
newdt = dt.Clone();
DataRow[] dr = dt.Select(condition);
for (int i = 0; i < dr.Length; i++)
{
newdt.ImportRow((DataRow)dr[i]);
}
return newdt;
}
}
/// <summary>
/// 轉換.NET的Type到數據庫參數的類型
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static DbType TypeToDbType(Type t)
{
DbType dbt;
try
{
dbt = (DbType)Enum.Parse(typeof(DbType), t.Name);
}
catch
{
dbt = DbType.Object;
}
return dbt;
}
/// <summary>
/// 使用分隔符串聯表格字段的內容,如:a,b,c
/// </summary>
/// <param name="dt">表格</param>
/// <param name="columnName">字段名稱</param>
/// <param name="append">增加的字符串,無則爲空</param>
/// <param name="splitChar">分隔符,如逗號(,)</param>
/// <returns></returns>
public static string ConcatColumnValue(DataTable dt, string columnName, string append, char splitChar)
{
string result = append;
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
result += string.Format("{0}{1}", splitChar, row[columnName]);
}
}
return result.Trim(splitChar);
}
/// <summary>
/// 使用逗號串聯表格字段的內容,如:a,b,c
/// </summary>
/// <param name="dt">表格</param>
/// <param name="columnName">字段名稱</param>
/// <param name="append">增加的字符串,無則爲空</param>
/// <returns></returns>
public static string ConcatColumnValue(DataTable dt, string columnName, string append)
{
string result = append;
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
result += string.Format(",{0}", row[columnName]);
}
}
return result.Trim(',');
}
/// <summary>
/// 判斷表格是否包含指定的全部字段名稱,如果其中一個不符合則返回false
/// </summary>
/// <param name="dt">表格對象</param>
/// <param name="columnString">字段列名稱,逗號分開</param>
/// <returns></returns>
public static bool ContainAllColumns(DataTable dt, string columnString)
{
bool result = true;
if (dt != null && !string.IsNullOrEmpty(columnString))
{
List<string> columnList = columnString.ToDelimitedList<string>(",");
foreach (string columnName in columnList)
{
if (!string.IsNullOrEmpty(columnName) && !dt.Columns.Contains(columnName))
{
result = false;
}
}
}
else
{
result = false;
}
return result;
}
}