radl+ReportViewer (转)
真正的全动态报表:RDLC+ReportViewer 阅读本文需要有 XML解析 及 ADO.net 相关经验。 本文编译器使用 Visual Studio 2005 数据库采用XML格式 ReportView 版本为2.0 .net版本为2.0 Crystal Repotrs的功能固然很强大,但是对我们写程序的人来说,是否支持动态生成才是最重要的。如果报表只能静态生成再嵌入到程序中,实在有些没意思。 二、结构模型
猛的一看有点复杂呵呵,其实还是挺简单的。 数据源 三、示例代码 请大家注意: 1. 这里我呈现给大家的只是如何实现报表,报表本身的制作 及 RDLC描述语言不在讨论范围。ADO.net同样不在讨论范围,感兴趣的读者可以参考这篇文章:《用VC轻松实现 ADO.net》。 //连接XML文件 DataSet^ DateSet1 = gcnew DataSet(); DataSet1->ReadXml("XML文件");4.一系列的数据填充 BindingSource^ aBindingSource; ReportDataSource^ reportDataSource1; //根据DateSet1设置BindingSource aBindingSource = gcnew BindingSource(); aBindingSource->DataMember = "Table1"; //注意,表名要同创建报表时用的相同 aBindingSource->DataSource = DataSet1; //根据BindingSource设置ReportDataSource reportDataSource1 = gcnew ReportDataSource(); reportDataSource1->Name = "DataSet1_Table1"; reportDataSource1->Value = aBindingSource; //根据ReportDataSource设置ReportViewer控件的数据源,ReportViewer控件最终用来显示报表 reportViewer1->LocalReport->DataSources->Add(reportDataSource1); reportViewer2->LocalReport->DataSources->Add(reportDataSource1); ..... //多个报表窗口可以使用同一个数据源5.连接要显示的报表 reportViewer1->LocalReport->ReportPath = "rdlc文件1"; reportViewer2->LocalReport->ReportPath = "rdlc文件2"; .....6.显示报表 reportViewer1->RefreshReport(); reportViewer2->RefreshReport(); .....7.报表的动态修改 对于普通的数据,只需修改DataSet即可 DataRow^ row = DataSet1->Tables["Table1"]->NewRow(); row[0] = newd->comboBox1->Text; //假设数据来自comboBox控件 row[1] = newd->comboBox2->Text; ..... DataSet1->Tables["Table1"]->Rows->Add(row); //刷新一下报表 reportViewer1->RefreshReport(); reportViewer2->RefreshReport(); .....对于图表之类的数据,需解析RDLC文件,修改之,然后调用RefreshReport()。由于其格式是XML文本,故比较容易,这方面不再多说,感兴趣的读者可以自己解析一下。 四、示例程序 在示例程序中我提供了一个记账本功能的小程序,使用XML数据库文件,两张RDLC报表文件。由于时间关系,没有去做RDLC文件解析,请大家见谅。
|