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