
提供其他的方式:rdlc文件属性,生成 *** 作:嵌入的资源。
VB.NET的一个示例代码:
Me.reportviewer.Reset()
'这个是相对路径调用的方法Me.reportviewer.LocalReport.ReportPath
=
Application.StartupPath
&
".\Reports\报表名.rdlc"
'增加报表数据源
Me.reportviewer.LocalReport.DataSources.Add(New
ReportDataSource("DataSet_IntMater",
DataSet.IntMaterComplain))
'使用嵌入的资源方式调用报表
Me.reportviewer.LocalReport.ReportEmbeddedResource
=
"项目名.报表名.rdlc"
Me.reportviewer.LocalReport.DisplayName
=
"报表"
Me.reportviewer.RefreshReport()
提供一种方案,使分页浏览的报表每页只显示N条记录,最后一页记录条数不足N的,用空行补齐。示例:
记录共7条,每页显示5条记录:
下载代码(vs2008,需要安装AdventureWorks数据库)
原理:
由于表的分组包含“在起始处分页”和”在结束处分页”的功能,所以我们考虑先将数据分成若干个记录条数为N的组,
再启用“在结束处分页”的功能。
那么,如何分组呢?考虑记录的下标为 0,1,2,3... 的自然数序列,用下标除以N(设为3),得到以下数列:
0 /3 取整:0
1 /3 取整:0
2 /3 取整:0
3 /3 取整:1
4 /3 取整:1
5 /3 取整:1
6 /3 取整:2
所以,我们可以以下标除以3的商的整数值对数据进行分组,则每个分组包含3条数据。当记录条数不能被3整除时,最后一个分组会不足3。分组表达式为 =Int((RowNumber(Nothing) - 1) / N)。
另一个需要考虑的问题是,最后一个分组的记录条数可能不足N,怎样以空白行补齐它呢?考虑TableRow.Visibility.Hidden属性,可通过表达式设置它的状态。为此,我们在详细信息组内额外添加N-1行,如果检查到当前是记录的最后一组最后一条并且该组记录条数不足N时,将Hidden设为Flase;其它情况为True。
表达式为=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= r,False,True)。其中r从1开始递增。
实现:
1.新建WinForm项目,用报表向导添加一张报表,数据源为AdventureWorksDataSet的Employee数据库表,调整详细信息(这里只选择了表内前面7条数据):
2.(以下都是在报表的设计模式中)在表内添加组,分组表达式为 =Int((RowNumber(Nothing) - 1) / 3),取消包括组头和包括组尾,勾选在结尾处分页:
3.连续插入两行:
4.选择插入的第一行(TableRow3),在Visibility的Hidden属性下选择“表达式”,在打开的文本框内填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= 1, False, True);同理,在插入的第二行(TableRow4)同位置填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= 2, False, True):
5.运行程序,可以看到前两页分别只有3条记录,最后一页1条,空白处用空行补齐了:
以MSServer自带Northwind库文件内的Customers及Orders这两个表为例,建立两个报表文件,在查询得出Customers的表数据后,点击此表内的CustomerID数据,报表将转入至下一个报表,并显示与之相关的Orders的数据,即VS中所谓的钻取式报表。
1、打开一个工程,并新建一个From,放入一个Button及一个ReportViewer控件。
2、在工程内新建一个数据源,连接到Northwind库文件,显示Customers及Orders这两个表
3、新建一个报表文件,并以表格的形式来显示数据,将Customers表内的CustomerID、CompanyName及Address三个字段放入,形成一份有表头及数据的简单报表,并将此报表保存命名为customerReport
4、再建一个报表文件,与customerReport相同,也以表格的形式来显示报表,将Orders内的OrderID、CustomerID、ShipName及OrderDate四个字段放入表格内,报表保存为orderReport
5、orderReport的数据源根据主报表customerReport的数据来确定数据源的数据,查看表格的数据集名称,我的显示为NorthwindDataSet_Orders,也可以自己另建一个,具体方法见我的《RDLC报表(二)》
6、再打开customerReport报表,将CustomerID设置成为可点击的索引字段,以便转入下一个报表。选择CustomerID字段,按鼠标右键,在”文本框属性“窗口中,选择”导航“选项卡,在下面的”超链接“中选择”跳至报表“,在报表名称中选择”orderReport“,再按下后面的”参数...“按钮,输入一个参数名称,如customerid,参数值选择=Fields!CustomerID.Value。为了与其它数据相区分,可以将此列数据根据自己的习惯改变颜色或加下划线
7、在orderReport中,设置一个报表参数,与CurtomerReprot中的名称相同,以接收父表中传入的参数
8、新建两个取得数据的方法,一个从Customers中取得数据集,另一个从Orders中取得数据集,且带参数。此两个方法可以自己编写类库来实现,也可以在VS的数据集内添加。为了演示方便,我直接使用了Customers的GetData(),并编写了一个Orders的GetDataByCustomerID(@cid)的方法。
9、在From的Button中编写如下代码:
private void button2_Click(object sender, EventArgs e)
{
NorthwindDataSet.CustomersDataTable dt1 = new NorthwindDataSetTableAdapters.CustomersTableAdapter().GetData()
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.customerReport.rdlc"
this.reportViewer1.LocalReport.DataSources.Clear()
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Customers", dt1))
this.reportViewer1.RefreshReport()
}
10、使用报表的Drillthrough事件,当选择了钻取项时会发生此事件,给下一个报表取值,代码如下:
private void reportViewer1_Drillthrough(object sender, DrillthroughEventArgs e)
{
LocalReport lp = (LocalReport)e.Report
string customerid = lp.GetParameters()["customerid"].Values[0].Trim()
lp.DataSources.Clear()
lp.DataSources.Add(new ReportDataSource("NorthwindDataSet_Orders",
new NorthwindDataSetTableAdapters.OrdersTableAdapter().GetDataByCustomerID(customerid)))
}
1.对于直接拖入Rdlc报表列表控件中的字段,列表显示控件的显示方式为:相当于每一个列表显示一行数据。如果直接在列表中拖入表控件,则会提示“表“table1”所在的列表中没有为其定义的组表达式。若要使用列表中的数据区域,列表必须包含组表达式。 ”2.对于分组属性(Grouping),拖入表控件,则表显示的详细内容为当前组的数据,Count函数则是对当前组进行行数统计。
3.对于子报表和钻取报表序号注意的是,由于子报表或者钻取报表是分开的两个Rdlc报表文件,报表的路径很关键。loaclreport.ReportEmbeddedResource属性是用来设置嵌入资源的名称,格式为“数据集.报表文件明.rdlc”,于此相对应的报表路径设置为loaclreport.ReportPath,用来设置文件路径。rdcl默认的读取方式为“嵌入资源”。但是,一旦设置了ReportPath属性,ReportEmbeddedResource就会失效。
4.对于子报表,需要在子报表加载事件reportViewer1.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing)的时候,想reportsource中加载数据源。
5.对于钻取报表,需要在子报表加载事件reportViewer1.Drillthrough += new Microsoft.Reporting.WinForms.DrillthroughEventHandler(reportViewer1_Drillthrough)
中加载数据源。
6.对于在钻取报表或者子报表时,发生错误“尚未指定 报表定义”,一般是由于报表路径问题产生的,在各自对应事件加载数据源的同时,再次指定转向报表的路径即可解决此问题。(目前此问题的具体原因尚为真正查明)
7.C#编程的过程中间,如何获取rdlc报表中的各个控件呢?以下实例显示了如果 *** 作界面控件:
ControlCollection coll = ReportViewer1.Parent.Controls
int oldIndex = coll.IndexOf(ReportViewer1)
ReportViewer newViewer = new ReportViewer()
coll.AddAt(oldIndex, newViewer)
coll.Remove(ReportViewer1)
8.在报表中,用程序设置报表参数:
ReportParameter rp = new ReportParameter("v1", ConfigurationManager.AppSettings["v1"].ToString())
this.ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp })
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)