遇到一个需求,是做一个程序用来打印一个稍微复杂的表单,有点像快递的发货单,就是里面的货品项目数量是动态增减的,而这种增减的“块”有2个。我客户没 有要求所以我就没做数据持久层,而只是做填单和打印。我采用水晶报表作为打印输出。不能用传统的水晶报表进行推模式绑定,我用的是主子报表的方式。
由 于是第一次用子报表,连绑定都不知道怎么搞,网上采用的更多是用dataset里包含多个datatable的方法进行数据绑定,而我的数据是对象集合的 方式在内存里储存,还是有不少差别。MSDN上也只讲了使用对象集合作为水晶报表的数据源,并没说过子报表的事,我尝试一下发现还是有办法的。
使用对象集合作为数据源和使用dataset方法都是 SetDataSource(),只要集合支持IDataReader或IEnumerable接口,就能进行绑定,我使用的全是范型自然是没问题。范型作为.NET2.0的新东东真是极大的发展了C#作为纯粹面向对象语言的能力,性能上的提升自不用说,对编程的方式也有较大的改进呀。
子报表的数据绑定也比较类似,我参考了网上找到的各种代码,悲哀的发现它们都不适合我(基于ADO.NET的,好象还有BUG)。我异想天开的用 rdDoc.Subreports["ManhourRPT.rpt"]这句,居然就这么简单的取到的子报表对象。
没什么需要多说的了,放出窗口的全部代码,我想对那些需要进行子报表对象集合数据源绑定的程序员来说,还是有一定参考价值:
程序代码
public partial class DocumentPrint : Form
{
public DocumentPrint(List<ServiceDocumentsInfo> serviceDocInfo, List<StuffInfo> stuffList, List<ManhourInfo> manhourList)
{
InitializeComponent();
//维修单主报表
ReportDocument rdDoc = new ReportDocument();
rdDoc.Load("ServiceDocumentRPT.rpt");
rdDoc.SetDataSource(serviceDocInfo);
//材料子报表
ReportDocument rdStuff = rdDoc.Subreports["StuffRPT.rpt"];
rdStuff.SetDataSource(stuffList);
//工时子报表
ReportDocument rdManhour = rdDoc.Subreports["ManhourRPT.rpt"];
rdManhour.SetDataSource(manhourList);
crystalReportViewer1.ReportSource = rdDoc;
}
}
由 于是第一次用子报表,连绑定都不知道怎么搞,网上采用的更多是用dataset里包含多个datatable的方法进行数据绑定,而我的数据是对象集合的 方式在内存里储存,还是有不少差别。MSDN上也只讲了使用对象集合作为水晶报表的数据源,并没说过子报表的事,我尝试一下发现还是有办法的。
使用对象集合作为数据源和使用dataset方法都是 SetDataSource(),只要集合支持IDataReader或IEnumerable接口,就能进行绑定,我使用的全是范型自然是没问题。范型作为.NET2.0的新东东真是极大的发展了C#作为纯粹面向对象语言的能力,性能上的提升自不用说,对编程的方式也有较大的改进呀。
子报表的数据绑定也比较类似,我参考了网上找到的各种代码,悲哀的发现它们都不适合我(基于ADO.NET的,好象还有BUG)。我异想天开的用 rdDoc.Subreports["ManhourRPT.rpt"]这句,居然就这么简单的取到的子报表对象。
没什么需要多说的了,放出窗口的全部代码,我想对那些需要进行子报表对象集合数据源绑定的程序员来说,还是有一定参考价值:

{
public DocumentPrint(List<ServiceDocumentsInfo> serviceDocInfo, List<StuffInfo> stuffList, List<ManhourInfo> manhourList)
{
InitializeComponent();
//维修单主报表
ReportDocument rdDoc = new ReportDocument();
rdDoc.Load("ServiceDocumentRPT.rpt");
rdDoc.SetDataSource(serviceDocInfo);
//材料子报表
ReportDocument rdStuff = rdDoc.Subreports["StuffRPT.rpt"];
rdStuff.SetDataSource(stuffList);
//工时子报表
ReportDocument rdManhour = rdDoc.Subreports["ManhourRPT.rpt"];
rdManhour.SetDataSource(manhourList);
crystalReportViewer1.ReportSource = rdDoc;
}
}