using System;
using System.Reflection;
using System.Collections;
using System.Resources;
using System.Windows.Forms;
using System.Data;
using System.Collections.Generic;
namespace Core.StlMes.Client.Sale.Util
{
public class UtilDataSet
{
#region dataset 组合构造
///
/// 根据列名组合一个ds,类型默认string
///
///
///
public static DataSet GetDataSetByDataColumn(string[] columnName)
{
DataSet ds = new DataSet();
if (columnName == null || columnName.Length == 0)
return null;
DataColumn dc = null;
DataTable dt = new DataTable();
Hashtable hsColumnCaption =
TbColumnAndCaptionDefine
.GetInstance().GetTbColumnAndCaption();
foreach (string s in columnName)
{
dc = new DataColumn(s, System.Type.GetType("System.String"));
if (hsColumnCaption.ContainsKey(s.ToUpper()))
{
dc.Caption = hsColumnCaption[s.ToUpper()].ToString();
}
dt.Columns.Add(dc);
}
ds.Tables.Add(dt);
return ds;
}
///
/// 设置Ds数据集,并检查ds的同字段类型是否和数据源一致,
/// 不一致则更改和数据源一致
///
///
///
public static void SetDataSetByMergeSameColumnName(ref DataSet dsStruct,DataSet dsSource)
{
if (dsStruct == null || dsStruct.Tables.Count == 0)
return ;
if (dsSource == null || dsSource.Tables.Count == 0)
return ;
dsStruct.Clear();
foreach (DataColumn dc in dsStruct.Tables[0].Columns)
{
if (dsSource.Tables[0].Columns.Contains(dc.ColumnName) &&
dsSource.Tables[0].Columns[dc.ColumnName].DataType != dc.DataType)
{
try
{
if (dsSource.Tables[0].Columns[dc.ColumnName].DataType == System.Type.GetType("System.DateTime"))
dc.DataType = dsSource.Tables[0].Columns[dc.ColumnName].DataType;
}
catch
{ }
}
}
// 数据结构没有的列不需要显示
dsStruct.Merge(dsSource, false, System.Data.MissingSchemaAction.Ignore);
dsStruct.AcceptChanges();
}
///
/// 从数据集中获取某一字段的值(string),并存入list
///
///
///
///
public static List GetColumnStringValueFromDataSourceByColumnName(DataSet dsSource, string columnName)
{
List list = new List();
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0 || columnName.Length == 0)
return list;
if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
return list;
try
{
foreach (DataRow dr in dsSource.Tables[0].Rows)
{
try
{
list.Add(dr[columnName.ToUpper()].ToString());
}
catch
{
break;
}
}
}
catch
{
}
return list;
}
#endregion
#region ds 客户端排序,过滤
///
/// 根据某个字段名称降序排ds
///
///
///
///
public static DataSet GetDsByDescOrderFromSourceDataSet(DataSet dsSource, string sortColumn)
{
DataSet ds = new DataSet();
try
{
if (dsSource != null & dsSource.Tables.Count > 0)
{
if (!dsSource.Tables[0].Columns.Contains(sortColumn))
return dsSource.Copy();
if (dsSource.Tables[0].Rows.Count == 0)
ds = dsSource.Clone();
else
{
DataView dv = new DataView(dsSource.Tables[0]);
dv.Sort = string.Format("{0} desc", sortColumn.ToUpper());
ds.Clear();
ds.Tables.Add(dv.ToTable());
}
}
}
catch
{
}
return ds;
}
///
/// 根据某个字段名称升序排ds
///
///
///
///
public static DataSet GetDsByAscOrderFromSourceDataSet(DataSet dsSource, string sortColumn)
{
DataSet ds = new DataSet();
try
{
if (dsSource != null & dsSource.Tables.Count > 0)
{
if (!dsSource.Tables[0].Columns.Contains(sortColumn))
return dsSource.Copy();
if (dsSource.Tables[0].Rows.Count == 0)
ds = dsSource.Clone();
else
{
DataView dv = new DataView(dsSource.Tables[0]);
dv.Sort = string.Format("{0} asc", sortColumn.ToUpper());
ds.Clear();
ds.Tables.Add(dv.ToTable());
}
}
}
catch
{
}
return ds;
}
///
/// 通过过滤条件过滤数据集,只能对string类型
///
///
///
///
public static DataSet GetDataSetWithRowFilter(DataSet dsSource, string columnName,string value)
{
DataSet dsReturn = new DataSet();
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
return dsSource;
if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
{
return dsSource;
}
string rowFilter = "";
if (value.Length == 0)
{
rowFilter = string.Format(" {0} is null ", columnName);
}
else
{
rowFilter = string.Format(" {0} = '{1}' ", columnName, value);
}
DataView dv = null;
try
{
dv = dsSource.Tables[0].DefaultView;
dv.RowFilter = rowFilter;
}
catch
{
dv = new DataView();
}
dsReturn.Tables.Add(dv.ToTable());
return dsReturn;
}
public static DataSet GetDataSetWithRowFilter(DataSet dsSource, string columnName, string[] value)
{
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
return dsSource;
if (value == null || value.Length == 0)
return dsSource;
if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
{
return dsSource;
}
DataSet dsReturn = dsSource.Clone();
string rowfil = "";
if (value.Length >= 300)
{
rowfil = columnName + " IN ('" + string.Join("','", value) + "')";
}
else {
foreach (string s in value)
{
string rowf = "";
if (s.Length == 0)
{
rowf = string.Format(" {0} is null ", columnName);
}
else
{
rowf = string.Format(" {0} = '{1}' ", columnName, s);
}
rowf += " or";
rowfil += rowf;
}
rowfil = "( " + rowfil + " 1= 2 )";
}
DataView dvs = null;
try
{
dvs = dsSource.Tables[0].DefaultView;
dvs.RowFilter = rowfil;
}
catch
{
dvs = new DataView();
}
dsReturn.Tables[0].Merge(dvs.ToTable());
return dsReturn;
}
public static DataSet GetDataSetWithRowFilterByArray(DataSet dsSource, string columnName, string[] value)
{
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
return dsSource;
if (value == null || value.Length == 0)
return dsSource;
if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
{
return dsSource;
}
DataSet dsReturn = dsSource.Clone();
foreach (String s in value)
{
string rowFilter = "";
if (s.Length == 0)
{
rowFilter = string.Format(" {0} is null ", columnName);
}
else
{
rowFilter = string.Format(" {0} = '{1}' ", columnName, s);
}
DataView dv = null;
try
{
dv = dsSource.Tables[0].DefaultView;
dv.RowFilter = rowFilter;
}
catch
{
dv = new DataView();
}
dsReturn.Tables[0].Merge(dv.ToTable());
}
return dsReturn;
}
///
/// 模糊匹配
///
///
///
///
///
public static DataSet GetDataSetWithRowFilterWithApproximateMatch(DataSet dsSource, string columnName, string value)
{
DataSet dsReturn = new DataSet();
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
return dsSource;
if (value.Length == 0)
return dsSource;
if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
{
return dsSource;
}
string rowFilter = string.Format(" {0} like '*{1}*' ", columnName, value);
DataView dv = null;
try
{
dv = dsSource.Tables[0].DefaultView;
dv.RowFilter = rowFilter;
}
catch
{
dv = new DataView();
}
dsReturn.Tables.Add(dv.ToTable());
return dsReturn;
}
#endregion
#region
///
/// 在客户端对dataset 进行分组统计
///
/// 待统计数据元
/// 待统计列
/// 需显示列
/// 需统计列,求和
///
public static DataSet GetDateSetByGroupColumnAndStaticsColumnName(DataSet dsSource,List groupColumnName,List showName,List staticsSumColumn )
{
string countStr = "CNTSTA";
string dsSourceKey = "GROUPKEY";
DataSet dsReturn = new DataSet();
if (groupColumnName == null || groupColumnName.Count == 0)
return dsReturn;
if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
return dsSource;
if (staticsSumColumn == null || staticsSumColumn.Count == 0)
{
staticsSumColumn = new List();
staticsSumColumn.Add(countStr);
}
else
{
staticsSumColumn.Add(countStr);
}
System.Collections.Hashtable hsKeyAndValue = new Hashtable();
System.Collections.Hashtable hsKeyAndTotalSum = new Hashtable();
System.Collections.Hashtable hsKeyAndTotalSumKe = new Hashtable();
List listColumnName = new List();
if (!dsSource.Tables[0].Columns.Contains(dsSourceKey))
{
DataColumn dcKey = new DataColumn(dsSourceKey, System.Type.GetType("System.String"));
dsSource.Tables[0].Columns.Add(dcKey);
}
dsReturn = dsSource.Clone();
// ds 中如果没有分组字段,返回源数据源,待统计列可以不管
foreach (string s in groupColumnName)
{
if (!dsSource.Tables[0].Columns.Contains(s.ToUpper()))
return dsSource;
if (!listColumnName.Contains(s.ToUpper()))
listColumnName.Add(s.ToUpper());
}
try
{
foreach (String s in showName)
{
if (!listColumnName.Contains(s.ToUpper()))
listColumnName.Add(s.ToUpper());
}
}
catch
{
}
try
{
foreach (String s in staticsSumColumn)
{
if (!listColumnName.Contains(s.ToUpper()))
listColumnName.Add(s.ToUpper());
if (!hsKeyAndTotalSum.Contains(s))
{
hsKeyAndTotalSum.Add(s, 0);
}
}
}
catch
{
}
string key = "";
DataRow value = null;
System.Text.StringBuilder sb = null;
foreach (DataRow dr in dsSource.Tables[0].Rows)
{
sb = new System.Text.StringBuilder();
value = dr;
foreach (String s in groupColumnName)
{
key = sb.Append(dr[s.ToUpper()].ToString()).ToString();
}
if (!hsKeyAndValue.ContainsKey(key))
{
value[dsSourceKey] = key;
hsKeyAndValue.Add(key, value);
hsKeyAndTotalSumKe.Add(key, new Hashtable());
}
double temp = 0;
hsKeyAndTotalSum = (Hashtable)hsKeyAndTotalSumKe[key];
foreach (string s in staticsSumColumn)
{
temp = 0;
try
{
if (hsKeyAndTotalSum.ContainsKey(s))
temp = ConverObject.ConvertToDouble(hsKeyAndTotalSum[s]) + ((s == countStr) ? 1 : ConverObject.ConvertToDouble(dr[s]));
else
temp = (s == countStr) ? 1 : ConverObject.ConvertToDouble(dr[s]);
if (hsKeyAndTotalSum.ContainsKey(s))
hsKeyAndTotalSum.Remove(s);
hsKeyAndTotalSum.Add(s, temp);
}
catch
{
}
}
hsKeyAndTotalSumKe[key] = hsKeyAndTotalSum;
}
foreach (string keys in hsKeyAndValue.Keys)
{
DataRow d = (DataRow)hsKeyAndValue[keys];
dsReturn.Tables[0].Rows.Add(d.ItemArray);
}
DataSet dsStruct = new DataSet();
DataColumn dc = null;
DataTable dt = new DataTable();
listColumnName.Add(dsSourceKey);
foreach (string s in listColumnName)
{
dc = new DataColumn(s, System.Type.GetType("System.String"));
if (staticsSumColumn.Contains(s))
dc.DataType = System.Type.GetType("System.Double");
dt.Columns.Add(dc);
}
dsStruct.Tables.Add(dt);
//
SetDataSetByMergeSameColumnName(ref dsStruct, dsReturn);
foreach (DataRow dr in dsStruct.Tables[0].Rows)
{
sb = new System.Text.StringBuilder();
Hashtable hsStatics = (Hashtable)hsKeyAndTotalSumKe[dr[dsSourceKey].ToString()];
foreach (string s in staticsSumColumn)
{
dr[s] = ConverObject.ConvertToDouble(hsStatics[s]);
}
}
dsStruct.Tables[0].Columns.Remove(dsSourceKey);
return dsStruct;
}
#endregion
}
}