一個報表如果要先按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逐行顯示,只是在遇到分組時,把該行某些列的值給“抹掉”.
