/// <summary> /// 分類小計,並有合計行 /// </summary> /// <param name="dt"></param> /// <param name="sColHeJi">顯示合計小計的字段</param> /// <param name="nColHeJi">需要顯示‘合計’字段的列</param> /// <param name="colsHeJi">需要合計的列</param> public DataRow dbDataTableSubSumRowsWithColList(DataTable dt, string sColHeJi, string[] colsGroup, string[] colsHeJi) { DataRow dr = dt.NewRow(); dr[sColHeJi] = "合計"; dt.Rows.Add(dr); //初始化合計數組 decimal[] arrDec = new decimal[colsHeJi.Length]; for (int i = 0; i < colsHeJi.Length; i++) { arrDec[i] = decimal.Zero; } //合計 for (int i = 0; i < dt.Rows.Count - 1; i++) { for (int j = 0; j < colsHeJi.Length; j++) { string cName = colsHeJi[j]; if (Convert.IsDBNull(dt.Rows[i][cName])) continue; arrDec[j] += Convert.ToDecimal(dt.Rows[i][cName]);//Tools.toDec(dt.Rows[i][cName] + ""); } } for (int i = 0; i < colsHeJi.Length; i++) { string cName = colsHeJi[i]; if (arrDec[i] == decimal.Zero) dr[cName] = DBNull.Value; else dr[cName] = arrDec[i]; } if (dt.Rows.Count <= 1) return dr; //小計 string sRate = ""; int currSubSumCol = dt.Rows.Count - 2; System.Collections.ArrayList ar = new System.Collections.ArrayList(); for (int i = dt.Rows.Count - 2; i >= 0; i--) { string currRate = dt.Rows[i]["belongedProjectTitle"] + ""; if (sRate != currRate) { if (i != dt.Rows.Count - 2) { dr = dt.NewRow(); dr[sColHeJi] = "小計"; for (int j = 0; j < colsHeJi.Length; j++) { string cName = colsHeJi[j]; if (arrDec[j] == decimal.Zero) dr[cName] = DBNull.Value; else dr[cName] = arrDec[j]; } dt.Rows.InsertAt(dr, currSubSumCol + 1); } currSubSumCol = i; sRate = currRate; for (int j = 0; j < colsHeJi.Length; j++) { //歸零 arrDec[j] = decimal.Zero; } } for (int j = 0; j < colsHeJi.Length; j++) { string cName = colsHeJi[j]; if (Convert.IsDBNull(dt.Rows[i][cName])) continue; arrDec[j] += Convert.ToDecimal(dt.Rows[i][cName]); } if (i == 0) { dr = dt.NewRow(); dr[sColHeJi] = "小計"; for (int j = 0; j < colsHeJi.Length; j++) { string cName = colsHeJi[j]; if (arrDec[j] == decimal.Zero) dr[cName] = DBNull.Value; else dr[cName] = arrDec[j]; } dt.Rows.InsertAt(dr, currSubSumCol + 1); } } return dr; }