一個報表如果要先按A分組,然后再按B分組,再按C分組...這種多條件分組情況下,RDLC報表處理起來並不方便。
只能另辟蹊徑,想些歪招了:
比如有一張員工表,里面有公司編碼COMPANYCODE,部門號DEPTNO,員工號EMPNO,員工姓名EMPNAME
需要在報表上,先按公司分組,相同公司的再按部門分組
看看下面的處理代碼
DataTable dt = new DataTable(); dt.Columns.Add("EMPNO", typeof(string)); dt.Columns.Add("EMPNAME", typeof(string)); dt.Columns.Add("DEPTNO", typeof(string)); dt.Columns.Add("COMPANYCODE", typeof(string)); dt.Columns.Add("COMPANYCODE_TITLE", typeof(string)); dt.Columns.Add("DEPTNO_TITLE", typeof(string)); dt.Rows.Add("001", "霍青桐", "A", "INFOSKY", "", ""); dt.Rows.Add("002", "鳳九", "B", "INFOSKY", "", ""); dt.Rows.Add("003", "程英", "C", "GSATEST", "", ""); dt.Rows.Add("000", "李沅芷", "A", "INFOSKY", "", ""); dt.DefaultView.Sort = "COMPANYCODE desc,DEPTNO asc,EMPNO"; dt = dt.DefaultView.ToTable(); for (int i = 0; i < dt.Rows.Count; i++) { var r = dt.Rows[i]; if (i == 0) { #region //第一行特殊處理 r["COMPANYCODE_TITLE"] = r["COMPANYCODE"]; r["DEPTNO_TITLE"] = r["DEPTNO"]; #endregion continue; } var r_pre = dt.Rows[i - 1]; #region //處理COMPANYCODE if (r["COMPANYCODE"].ToString() == r_pre["COMPANYCODE"].ToString()) { r["COMPANYCODE_TITLE"] = String.Empty; } else { r["COMPANYCODE_TITLE"] = r["COMPANYCODE"]; } #endregion #region //處理DEPTNO if (r["DEPTNO"].ToString() == r_pre["DEPTNO"].ToString()) { r["DEPTNO_TITLE"] = String.Empty; } else { r["DEPTNO_TITLE"] = r["DEPTNO"]; } #endregion } //打印輸出 foreach (DataRow r in dt.Rows) { Console.Write("{0}\t{1}\t{2}\t{3}\n", r["COMPANYCODE_TITLE"], r["DEPTNO_TITLE"], r["EMPNO"], r["EMPNAME"]); } Console.Read();
這里用控制台程序模擬報表的輸出,最終打印結果:
原理就是:只用一個DataTable逐行顯示,只是在遇到分組時,把該行某些列的值給“抹掉”.