一个报表如果要先按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逐行显示,只是在遇到分组时,把该行某些列的值给“抹掉”.