一个报表,显示主记录与相关的子记录,使用RDLC,经两个多小时的摸索,总算是搞出个DEMO,赶紧记下来,以备以后查看。
步骤1:建立一个报表,在报表中加入“列表”控件,在列表中加入文本框,将主记录数据源绑定到文本框中,示例中有一个“姓名”字段,主表与子表靠这个字段来关联。
步骤2:在列表中插入一个“子报表”控件,新建一个报表,将此子报表控件的子报表属性选择为新建的这个报表。
步骤3:在子报表属性的参数中加入一个参数“姓名”,参数值=“=Fields!姓名.Value”。
步骤4:打开子报表,在报表属性中加入一个报表参数“姓名”,这个参数与上一步设置的参数同名。
步骤5:在子报表中加入表格控件,表的属性中的筛选器加入“=Fields!姓名.Value”=“=Parameters!姓名.Value”。
步骤6:在报表浏览器所在的界面中还需有代码配合,我的示例代码如下:
view plaincopy to clipboardprint?
public partial class Form2 : Form
{
DataTable dt2;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
ReportViewer reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "Report1.rdlc";
reportViewer.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
reportViewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1_DataTable1", loadData1()));
reportViewer.Dock = DockStyle.Fill;
this.Controls.Add(reportViewer);
reportViewer.RefreshReport();
}
private void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WinForms.SubreportProcessingEventArgs e)
{
if (dt2 == null)
dt2 = loadData2();
e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1_DataTable2", dt2));
}
private DataTable loadData1()
{
DataSet1.DataTable1DataTable dt = new DataSet1.DataTable1DataTable();
DataRow dr1 = dt.NewRow();
dr1["姓名"] = "王三";
dr1["日期"] = DateTime.Now.ToShortDateString();
dr1["金额"] = 130.45;
dr1["余额"] = 1234.33;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["姓名"] = "李四";
dr2["日期"] = DateTime.Now.ToShortDateString();
dr2["金额"] = 111.33;
dr2["余额"] = 22.3;
dt.Rows.Add(dr2);
return dt;
}
private DataTable loadData2()
{
DataSet1.DataTable2DataTable dt2 = new DataSet1.DataTable2DataTable();
DataRow d1 = dt2.NewRow();
d1["姓名"] = "王三";
d1["编号"] = "0001";
d1["名称"] = "床位费";
d1["价格"] = 10;
d1["数量"] = 1;
d1["金额"] = 10;
dt2.Rows.Add(d1);
DataRow d2 = dt2.NewRow();
d2["姓名"] = "王三";
d2["编号"] = "0002";
d2["名称"] = "护理费";
d2["价格"] = 8;
d2["数量"] = 3;
d2["金额"] = 24;
dt2.Rows.Add(d2);
DataRow d3 = dt2.NewRow();
d3["姓名"] = "李四";
d3["编号"] = "0002";
d3["名称"] = "注射费";
d3["价格"] = 8;
d3["数量"] = 3;
d3["金额"] = 24;
dt2.Rows.Add(d3);
return dt2;
}
public partial class Form2 : Form
{
DataTable dt2;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
ReportViewer reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "Report1.rdlc";
reportViewer.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
reportViewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1_DataTable1", loadData1()));
reportViewer.Dock = DockStyle.Fill;
this.Controls.Add(reportViewer);
reportViewer.RefreshReport();
}
private void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WinForms.SubreportProcessingEventArgs e)
{
if (dt2 == null)
dt2 = loadData2();
e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1_DataTable2", dt2));
}
private DataTable loadData1()
{
DataSet1.DataTable1DataTable dt = new DataSet1.DataTable1DataTable();
DataRow dr1 = dt.NewRow();
dr1["姓名"] = "王三";
dr1["日期"] = DateTime.Now.ToShortDateString();
dr1["金额"] = 130.45;
dr1["余额"] = 1234.33;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["姓名"] = "李四";
dr2["日期"] = DateTime.Now.ToShortDateString();
dr2["金额"] = 111.33;
dr2["余额"] = 22.3;
dt.Rows.Add(dr2);
return dt;
}
private DataTable loadData2()
{
DataSet1.DataTable2DataTable dt2 = new DataSet1.DataTable2DataTable();
DataRow d1 = dt2.NewRow();
d1["姓名"] = "王三";
d1["编号"] = "0001";
d1["名称"] = "床位费";
d1["价格"] = 10;
d1["数量"] = 1;
d1["金额"] = 10;
dt2.Rows.Add(d1);
DataRow d2 = dt2.NewRow();
d2["姓名"] = "王三";
d2["编号"] = "0002";
d2["名称"] = "护理费";
d2["价格"] = 8;
d2["数量"] = 3;
d2["金额"] = 24;
dt2.Rows.Add(d2);
DataRow d3 = dt2.NewRow();
d3["姓名"] = "李四";
d3["编号"] = "0002";
d3["名称"] = "注射费";
d3["价格"] = 8;
d3["数量"] = 3;
d3["金额"] = 24;
dt2.Rows.Add(d3);
return dt2;
}
其中LocalReport_SubreportProcessing这个方法需手工加,再给报表控件加上这个事件的引用,在这个事件中给子报表加数据库源,才可显示子报表。
另外,可以通过
string txt = first.ToShortDateString() + " 至 " + last.ToShortDateString();
ReportParameter rp = new ReportParameter("Report_Parameter_0", txt);
reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter[] { rp });
这种方法从外部给报表传递参数值,当然,需事先在报表中设计好相应的控件接收这个参数值。这主要用于显示如表头,表尾的一些信息。