UtilDataSet.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. using System;
  2. using System.Reflection;
  3. using System.Collections;
  4. using System.Resources;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Collections.Generic;
  8. namespace Core.StlMes.Client.Sale.Util
  9. {
  10. public class UtilDataSet
  11. {
  12. #region dataset 组合构造
  13. /// <summary>
  14. /// 根据列名组合一个ds,类型默认string
  15. /// </summary>
  16. /// <param name="columnName"></param>
  17. /// <returns></returns>
  18. public static DataSet GetDataSetByDataColumn(string[] columnName)
  19. {
  20. DataSet ds = new DataSet();
  21. if (columnName == null || columnName.Length == 0)
  22. return null;
  23. DataColumn dc = null;
  24. DataTable dt = new DataTable();
  25. Hashtable hsColumnCaption =
  26. TbColumnAndCaptionDefine
  27. .GetInstance().GetTbColumnAndCaption();
  28. foreach (string s in columnName)
  29. {
  30. dc = new DataColumn(s, System.Type.GetType("System.String"));
  31. if (hsColumnCaption.ContainsKey(s.ToUpper()))
  32. {
  33. dc.Caption = hsColumnCaption[s.ToUpper()].ToString();
  34. }
  35. dt.Columns.Add(dc);
  36. }
  37. ds.Tables.Add(dt);
  38. return ds;
  39. }
  40. /// <summary>
  41. /// 设置Ds数据集,并检查ds的同字段类型是否和数据源一致,
  42. /// 不一致则更改和数据源一致
  43. /// </summary>
  44. /// <param name="dsStruct"></param>
  45. /// <param name="dsSource"></param>
  46. public static void SetDataSetByMergeSameColumnName(ref DataSet dsStruct,DataSet dsSource)
  47. {
  48. if (dsStruct == null || dsStruct.Tables.Count == 0)
  49. return ;
  50. if (dsSource == null || dsSource.Tables.Count == 0)
  51. return ;
  52. dsStruct.Clear();
  53. foreach (DataColumn dc in dsStruct.Tables[0].Columns)
  54. {
  55. if (dsSource.Tables[0].Columns.Contains(dc.ColumnName) &&
  56. dsSource.Tables[0].Columns[dc.ColumnName].DataType != dc.DataType)
  57. {
  58. try
  59. {
  60. if (dsSource.Tables[0].Columns[dc.ColumnName].DataType == System.Type.GetType("System.DateTime"))
  61. dc.DataType = dsSource.Tables[0].Columns[dc.ColumnName].DataType;
  62. }
  63. catch
  64. { }
  65. }
  66. }
  67. // 数据结构没有的列不需要显示
  68. dsStruct.Merge(dsSource, false, System.Data.MissingSchemaAction.Ignore);
  69. dsStruct.AcceptChanges();
  70. }
  71. /// <summary>
  72. /// 从数据集中获取某一字段的值(string),并存入list
  73. /// </summary>
  74. /// <param name="dsSource"></param>
  75. /// <param name="columnName"></param>
  76. /// <returns></returns>
  77. public static List<String> GetColumnStringValueFromDataSourceByColumnName(DataSet dsSource, string columnName)
  78. {
  79. List<String> list = new List<string>();
  80. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0 || columnName.Length == 0)
  81. return list;
  82. if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
  83. return list;
  84. try
  85. {
  86. foreach (DataRow dr in dsSource.Tables[0].Rows)
  87. {
  88. try
  89. {
  90. list.Add(dr[columnName.ToUpper()].ToString());
  91. }
  92. catch
  93. {
  94. break;
  95. }
  96. }
  97. }
  98. catch
  99. {
  100. }
  101. return list;
  102. }
  103. #endregion
  104. #region ds 客户端排序,过滤
  105. /// <summary>
  106. /// 根据某个字段名称降序排ds
  107. /// </summary>
  108. /// <param name="dsSource"></param>
  109. /// <param name="sortColumn"></param>
  110. /// <returns></returns>
  111. public static DataSet GetDsByDescOrderFromSourceDataSet(DataSet dsSource, string sortColumn)
  112. {
  113. DataSet ds = new DataSet();
  114. try
  115. {
  116. if (dsSource != null & dsSource.Tables.Count > 0)
  117. {
  118. if (!dsSource.Tables[0].Columns.Contains(sortColumn))
  119. return dsSource.Copy();
  120. if (dsSource.Tables[0].Rows.Count == 0)
  121. ds = dsSource.Clone();
  122. else
  123. {
  124. DataView dv = new DataView(dsSource.Tables[0]);
  125. dv.Sort = string.Format("{0} desc", sortColumn.ToUpper());
  126. ds.Clear();
  127. ds.Tables.Add(dv.ToTable());
  128. }
  129. }
  130. }
  131. catch
  132. {
  133. }
  134. return ds;
  135. }
  136. /// <summary>
  137. /// 根据某个字段名称升序排ds
  138. /// </summary>
  139. /// <param name="dsSource"></param>
  140. /// <param name="sortColumn"></param>
  141. /// <returns></returns>
  142. public static DataSet GetDsByAscOrderFromSourceDataSet(DataSet dsSource, string sortColumn)
  143. {
  144. DataSet ds = new DataSet();
  145. try
  146. {
  147. if (dsSource != null & dsSource.Tables.Count > 0)
  148. {
  149. if (!dsSource.Tables[0].Columns.Contains(sortColumn))
  150. return dsSource.Copy();
  151. if (dsSource.Tables[0].Rows.Count == 0)
  152. ds = dsSource.Clone();
  153. else
  154. {
  155. DataView dv = new DataView(dsSource.Tables[0]);
  156. dv.Sort = string.Format("{0} asc", sortColumn.ToUpper());
  157. ds.Clear();
  158. ds.Tables.Add(dv.ToTable());
  159. }
  160. }
  161. }
  162. catch
  163. {
  164. }
  165. return ds;
  166. }
  167. /// <summary>
  168. /// 通过过滤条件过滤数据集,只能对string类型
  169. /// </summary>
  170. /// <param name="dsSource"></param>
  171. /// <param name="rowFilter"></param>
  172. /// <returns></returns>
  173. public static DataSet GetDataSetWithRowFilter(DataSet dsSource, string columnName,string value)
  174. {
  175. DataSet dsReturn = new DataSet();
  176. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
  177. return dsSource;
  178. if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
  179. {
  180. return dsSource;
  181. }
  182. string rowFilter = "";
  183. if (value.Length == 0)
  184. {
  185. rowFilter = string.Format(" {0} is null ", columnName);
  186. }
  187. else
  188. {
  189. rowFilter = string.Format(" {0} = '{1}' ", columnName, value);
  190. }
  191. DataView dv = null;
  192. try
  193. {
  194. dv = dsSource.Tables[0].DefaultView;
  195. dv.RowFilter = rowFilter;
  196. }
  197. catch
  198. {
  199. dv = new DataView();
  200. }
  201. dsReturn.Tables.Add(dv.ToTable());
  202. return dsReturn;
  203. }
  204. public static DataSet GetDataSetWithRowFilter(DataSet dsSource, string columnName, string[] value)
  205. {
  206. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
  207. return dsSource;
  208. if (value == null || value.Length == 0)
  209. return dsSource;
  210. if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
  211. {
  212. return dsSource;
  213. }
  214. DataSet dsReturn = dsSource.Clone();
  215. string rowfil = "";
  216. if (value.Length >= 300)
  217. {
  218. rowfil = columnName + " IN ('" + string.Join("','", value) + "')";
  219. }
  220. else {
  221. foreach (string s in value)
  222. {
  223. string rowf = "";
  224. if (s.Length == 0)
  225. {
  226. rowf = string.Format(" {0} is null ", columnName);
  227. }
  228. else
  229. {
  230. rowf = string.Format(" {0} = '{1}' ", columnName, s);
  231. }
  232. rowf += " or";
  233. rowfil += rowf;
  234. }
  235. rowfil = "( " + rowfil + " 1= 2 )";
  236. }
  237. DataView dvs = null;
  238. try
  239. {
  240. dvs = dsSource.Tables[0].DefaultView;
  241. dvs.RowFilter = rowfil;
  242. }
  243. catch
  244. {
  245. dvs = new DataView();
  246. }
  247. dsReturn.Tables[0].Merge(dvs.ToTable());
  248. return dsReturn;
  249. }
  250. public static DataSet GetDataSetWithRowFilterByArray(DataSet dsSource, string columnName, string[] value)
  251. {
  252. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
  253. return dsSource;
  254. if (value == null || value.Length == 0)
  255. return dsSource;
  256. if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
  257. {
  258. return dsSource;
  259. }
  260. DataSet dsReturn = dsSource.Clone();
  261. foreach (String s in value)
  262. {
  263. string rowFilter = "";
  264. if (s.Length == 0)
  265. {
  266. rowFilter = string.Format(" {0} is null ", columnName);
  267. }
  268. else
  269. {
  270. rowFilter = string.Format(" {0} = '{1}' ", columnName, s);
  271. }
  272. DataView dv = null;
  273. try
  274. {
  275. dv = dsSource.Tables[0].DefaultView;
  276. dv.RowFilter = rowFilter;
  277. }
  278. catch
  279. {
  280. dv = new DataView();
  281. }
  282. dsReturn.Tables[0].Merge(dv.ToTable());
  283. }
  284. return dsReturn;
  285. }
  286. /// <summary>
  287. /// 模糊匹配
  288. /// </summary>
  289. /// <param name="dsSource"></param>
  290. /// <param name="columnName"></param>
  291. /// <param name="value"></param>
  292. /// <returns></returns>
  293. public static DataSet GetDataSetWithRowFilterWithApproximateMatch(DataSet dsSource, string columnName, string value)
  294. {
  295. DataSet dsReturn = new DataSet();
  296. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
  297. return dsSource;
  298. if (value.Length == 0)
  299. return dsSource;
  300. if (!dsSource.Tables[0].Columns.Contains(columnName.ToUpper()))
  301. {
  302. return dsSource;
  303. }
  304. string rowFilter = string.Format(" {0} like '*{1}*' ", columnName, value);
  305. DataView dv = null;
  306. try
  307. {
  308. dv = dsSource.Tables[0].DefaultView;
  309. dv.RowFilter = rowFilter;
  310. }
  311. catch
  312. {
  313. dv = new DataView();
  314. }
  315. dsReturn.Tables.Add(dv.ToTable());
  316. return dsReturn;
  317. }
  318. #endregion
  319. #region
  320. /// <summary>
  321. /// 在客户端对dataset 进行分组统计
  322. /// </summary>
  323. /// <param name="dsSource">待统计数据元</param>
  324. /// <param name="groupColumnName">待统计列</param>
  325. /// <param name="showName">需显示列</param>
  326. /// <param name="staticsSumColumn">需统计列,求和</param>
  327. /// <returns></returns>
  328. public static DataSet GetDateSetByGroupColumnAndStaticsColumnName(DataSet dsSource,List<String> groupColumnName,List<String> showName,List<String> staticsSumColumn )
  329. {
  330. string countStr = "CNTSTA";
  331. string dsSourceKey = "GROUPKEY";
  332. DataSet dsReturn = new DataSet();
  333. if (groupColumnName == null || groupColumnName.Count == 0)
  334. return dsReturn;
  335. if (dsSource == null || dsSource.Tables.Count == 0 || dsSource.Tables[0].Rows.Count == 0)
  336. return dsSource;
  337. if (staticsSumColumn == null || staticsSumColumn.Count == 0)
  338. {
  339. staticsSumColumn = new List<string>();
  340. staticsSumColumn.Add(countStr);
  341. }
  342. else
  343. {
  344. staticsSumColumn.Add(countStr);
  345. }
  346. System.Collections.Hashtable hsKeyAndValue = new Hashtable();
  347. System.Collections.Hashtable hsKeyAndTotalSum = new Hashtable();
  348. System.Collections.Hashtable hsKeyAndTotalSumKe = new Hashtable();
  349. List<string> listColumnName = new List<string>();
  350. if (!dsSource.Tables[0].Columns.Contains(dsSourceKey))
  351. {
  352. DataColumn dcKey = new DataColumn(dsSourceKey, System.Type.GetType("System.String"));
  353. dsSource.Tables[0].Columns.Add(dcKey);
  354. }
  355. dsReturn = dsSource.Clone();
  356. // ds 中如果没有分组字段,返回源数据源,待统计列可以不管
  357. foreach (string s in groupColumnName)
  358. {
  359. if (!dsSource.Tables[0].Columns.Contains(s.ToUpper()))
  360. return dsSource;
  361. if (!listColumnName.Contains(s.ToUpper()))
  362. listColumnName.Add(s.ToUpper());
  363. }
  364. try
  365. {
  366. foreach (String s in showName)
  367. {
  368. if (!listColumnName.Contains(s.ToUpper()))
  369. listColumnName.Add(s.ToUpper());
  370. }
  371. }
  372. catch
  373. {
  374. }
  375. try
  376. {
  377. foreach (String s in staticsSumColumn)
  378. {
  379. if (!listColumnName.Contains(s.ToUpper()))
  380. listColumnName.Add(s.ToUpper());
  381. if (!hsKeyAndTotalSum.Contains(s))
  382. {
  383. hsKeyAndTotalSum.Add(s, 0);
  384. }
  385. }
  386. }
  387. catch
  388. {
  389. }
  390. string key = "";
  391. DataRow value = null;
  392. System.Text.StringBuilder sb = null;
  393. foreach (DataRow dr in dsSource.Tables[0].Rows)
  394. {
  395. sb = new System.Text.StringBuilder();
  396. value = dr;
  397. foreach (String s in groupColumnName)
  398. {
  399. key = sb.Append(dr[s.ToUpper()].ToString()).ToString();
  400. }
  401. if (!hsKeyAndValue.ContainsKey(key))
  402. {
  403. value[dsSourceKey] = key;
  404. hsKeyAndValue.Add(key, value);
  405. hsKeyAndTotalSumKe.Add(key, new Hashtable());
  406. }
  407. double temp = 0;
  408. hsKeyAndTotalSum = (Hashtable)hsKeyAndTotalSumKe[key];
  409. foreach (string s in staticsSumColumn)
  410. {
  411. temp = 0;
  412. try
  413. {
  414. if (hsKeyAndTotalSum.ContainsKey(s))
  415. temp = ConverObject.ConvertToDouble(hsKeyAndTotalSum[s]) + ((s == countStr) ? 1 : ConverObject.ConvertToDouble(dr[s]));
  416. else
  417. temp = (s == countStr) ? 1 : ConverObject.ConvertToDouble(dr[s]);
  418. if (hsKeyAndTotalSum.ContainsKey(s))
  419. hsKeyAndTotalSum.Remove(s);
  420. hsKeyAndTotalSum.Add(s, temp);
  421. }
  422. catch
  423. {
  424. }
  425. }
  426. hsKeyAndTotalSumKe[key] = hsKeyAndTotalSum;
  427. }
  428. foreach (string keys in hsKeyAndValue.Keys)
  429. {
  430. DataRow d = (DataRow)hsKeyAndValue[keys];
  431. dsReturn.Tables[0].Rows.Add(d.ItemArray);
  432. }
  433. DataSet dsStruct = new DataSet();
  434. DataColumn dc = null;
  435. DataTable dt = new DataTable();
  436. listColumnName.Add(dsSourceKey);
  437. foreach (string s in listColumnName)
  438. {
  439. dc = new DataColumn(s, System.Type.GetType("System.String"));
  440. if (staticsSumColumn.Contains(s))
  441. dc.DataType = System.Type.GetType("System.Double");
  442. dt.Columns.Add(dc);
  443. }
  444. dsStruct.Tables.Add(dt);
  445. //
  446. SetDataSetByMergeSameColumnName(ref dsStruct, dsReturn);
  447. foreach (DataRow dr in dsStruct.Tables[0].Rows)
  448. {
  449. sb = new System.Text.StringBuilder();
  450. Hashtable hsStatics = (Hashtable)hsKeyAndTotalSumKe[dr[dsSourceKey].ToString()];
  451. foreach (string s in staticsSumColumn)
  452. {
  453. dr[s] = ConverObject.ConvertToDouble(hsStatics[s]);
  454. }
  455. }
  456. dsStruct.Tables[0].Columns.Remove(dsSourceKey);
  457. return dsStruct;
  458. }
  459. #endregion
  460. }
  461. }