引言
在做一些应用程序时难免会涉及到报表的查看和office文件的导出,这里主要介绍 VS2010下 ReportViewer控件报表的使用。关于ReportViewer控件的一般性用途可查阅的资料已经很完善了,此处不再赘述。
一般地,当报表格式定死的时候,我们只需要在.rdlc文件上按照给定的布局,布置好界面,再将数据绑定上去即可实现报表的显示了。比如,可以添加一个 table作为查询数据的呈现,然后指定绑定的dataset,将table的每一列数据指定好就可以了;但是,在一些情况下,我们无法获知需要显示数据的 大小(table列的数量),而且,这个数据源可能是来自很多地方而不是只针对数据库中的一个表或视图,这样就导致这种传统方法的失效!
正文
实际上,很多前辈已经很好得解决了这个问题,即动态生成 .rdlc文件,我在这些基础上根据我个人的应用情况,写下此文以作记录。主要参考代码为“蜡人张” ,“RDLC”--“DynamicTable”,该程序(代码在后面文章链接里面可以下载)。“DynamicTable”是以XML作为数据源动态生成rdlc并呈现在 ReportViewer上面,这种方法分离了.rdlc文件和数据源的“死绑定”,可以更加灵活的适应复杂的数据来源问题。
1.可以根据实际情况自动创建 DataTable数据,
2.根据DataTable的列的数目动态生成符合的Table,并动态生成.rdlc格式的流文件
3.private MemoryStream m_rdl; this.reportViewer1.LocalReport.LoadReportDefinition(m_rdl);
藉此方法,我们还可以代码生成其他类型的数据,比如一个显示Table,文本框等
步骤
1.首先,找到创建Report的函数,其中CreateDataSources() 创建数据连接函数,CreateBody()为为报告主体,CreateDataSets()创建数据集
private Rdl.Report CreateReport()
{
Rdl.Report report = new Rdl.Report();
report.Items = new object[]
{
CreateDataSources(),
CreateBody(),
CreateDataSets(),
"6.5in",
};
report.ItemsElementName = new Rdl.ItemsChoiceType37[]
{
Rdl.ItemsChoiceType37.DataSources,
Rdl.ItemsChoiceType37.Body,
Rdl.ItemsChoiceType37.DataSets,
Rdl.ItemsChoiceType37.Width,
};
return report;
}
2.其中我们主要关注CreateBody(),自动创建的table和textBox就在此函数里面实现,CreateReportItems()里包含各显示项目
private Rdl.BodyType CreateBody()
{
Rdl.BodyType body = new Rdl.BodyType(