好久没来,发现csdn blog大变样了,刷了几次,终于可以写字了,不容易呀!
一直以来,都在不停加班,难得今天没bug,赶紧跑回家!
因为做个项目,可能要使用报表。原来以为只能用水晶报表,可是又要注册,那麽麻烦。反正要做的是简单的报表,也用不上那麽多功能。在网上搜搜搜,才发现原来2005已经有rdlc了。庆幸多亏当初做项目时,是用vs2005做的。
更多内容不累述,就说一下我从头做起遇到的问题和解决的方法,只适合初学者的。
首先,按照网上说的,先做了一个DataSet1.xsd,准备做报表的数据源,这样拖字段也比较省力,结果一编译DataSet1.xsd这个文件就报错!我还一行代码没写呢,它就报错,难道因为我的数据表是中文的缘故?不懂,原来没用过这个,不晓得怎莫回事,还好不用这个也行,设计好报表,就把这文件删了,直接在代码里动态邦定数据源,看它还如何报错。
从来没做过rdlc报表,做的时候只能按照网上的图片想,建子报表时,怎莫也找不到报表参数,后来往vs的工具栏一看,原来在这里呀。“报表”-〉“报表参数”,我还一直在属性里找呢。
报表都设计好了,可以写代码了,代码大致copy了一下,改一改,然后运行,不错,出来了。如果代码写的有问题,报表就会显示一片空白,也不报错。
报表出来了,该看看打印了,toolbar上竟然没有打印按钮。要打印按钮还得做报表服务器,算了,能导出来打印也行。点导出pdf,竟然弹出ReportViewerWebControl.axd的窗口,之后点什莫都无法导出来。导出excel也是一样!数据源有问题?报表中有中文?都不是呀!搜了半天,原来是要设置ReportViewer的属性ExportContentDisposition=AlwaysInLine。这莫简单的问题,怎莫就是没人说呢?
报表导出pdf也正常了。又发现一个问题:导出的数据都在奇数页里,偶数页都是空白页!因为我的报表至少要2页,如果只有一页的话,就没有这种问题。我把报表里的list拖拖拽拽,改变大小,位置,嵌套list,怎莫都不行。原来问题还是出在报表设计上,在vs菜单上,点“报表”-〉“报表属性”-〉“布局”,缩小左右边距。这回终于ok了。
至此,终于做出了第一个报表,不容易呀!
贴一下源码:
{
string connstring = "...";
string str1 ="... ",str2 = "...";
System.Data.SqlClient.SqlConnection conn1 = new System.Data.SqlClient.SqlConnection(connstring);
System.Data.SqlClient.SqlCommand command1 = new System.Data.SqlClient.SqlCommand(str1, conn1);
System.Data.SqlClient.SqlDataAdapter ada1 = new System.Data.SqlClient.SqlDataAdapter(command1);
try
{
c_ds.Tables.Add("account");
c_ds.Tables.Add("accountDetails");
conn1.Open();
ada1.Fill(c_ds);
ada1.Fill(c_ds.Tables["account"]);
ada1.SelectCommand.CommandText = str2;
ada1.Fill(c_ds.Tables["accountDetails"]);
}
finally
{
conn1.Close();
command1.Dispose();
conn1.Dispose();
}
ReportViewer1.ProcessingMode = ProcessingMode.Local;
LocalReport localReport=new LocalReport();
localReport = ReportViewer1.LocalReport;
localReport.ReportPath = "Report1.rdlc";
localReport.SubreportProcessing += new Microsoft.Reporting.WebForms.SubreportProcessingEventHandler(SubReportProcessingEventHandler);
localReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSet2_账单信息表",c_ds.Tables["account"]));
localReport.Refresh();
}
private void SubReportProcessingEventHandler(object sender, Microsoft.Reporting.WebForms.SubreportProcessingEventArgs e)
{
e.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSet2_账单细目表_小时", c_ds.Tables["accountDetails"]));
}