水晶报表主表与子表数据动态绑定
首先创建数据集文件data.xsd
创建好主表以及子表后建立数据链接
最后是代码绑定
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CrystalDecisions.Shared;
namespace SubReportDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 创建主表与子表的数据源
DataTable mainTable = new DataTable();
mainTable.Columns.Add(new DataColumn("id", Type.GetType("System.Int32")));
mainTable.Columns.Add(new DataColumn("name", Type.GetType("System.String")));
for (int i = 0; i < 3; i++)
{
DataRow dr = mainTable.NewRow();
dr["id"] = i + 1;
dr["name"] = "大类" + (i + 1).ToString();
mainTable.Rows.Add(dr);
}
DataTable subTable = new DataTable();
subTable.Columns.Add(new DataColumn("id", Type.GetType("System.Int32")));
subTable.Columns.Add(new DataColumn("name", Type.GetType("System.String")));
subTable.Columns.Add(new DataColumn("fatherId", Type.GetType("System.Int32")));
for (int i = 0; i < 9; i++)
{
DataRow dr = subTable.NewRow();
dr["id"] = i + 1;
dr["name"] = "小类" + (i + 1).ToString();
if (i >= 6)
dr["fatherId"] = 3;
else if (i >= 3)
dr["fatherId"] = 2;
else
dr["fatherId"] = 1;
subTable.Rows.Add(dr);
}
// 主表以及子表绑定两个DataTable数据源
mainReport1.SetDataSource(mainTable);
mainReport1.OpenSubreport("subReport").SetDataSource(subTable);
// 传递参数
// 主报表
ParameterFields paramFields = new ParameterFields();
ParameterField paramField = new ParameterField();
paramField.ParameterFieldName = "作者";
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
discreteVal.Value = "主报表参数:Julian.zhu";
paramField.CurrentValues.Add(discreteVal);
paramFields.Add(paramField);
crystalReportViewer1.ParameterFieldInfo = paramFields;
// 子报表
ParameterValues values = new ParameterValues();
ParameterDiscreteValue discreteVal1 = new ParameterDiscreteValue();
discreteVal1.Value = "子报表参数:Julian.zhu";
values.Add(discreteVal1);
mainReport1.DataDefinition.ParameterFields["作者", "subReport"].ApplyCurrentValues(values);
crystalReportViewer1.ReportSource = mainReport1;
}
private void mainReport1_InitReport(object sender, EventArgs e)
{
}
}
}