我正在尝试让一个子报表正常工作。我正在使用VS 2010。我在我的主报告中插入了一个"Subreport1",并不断收到错误:位于…的子报告"Subreport1"的数据检索失败
这是我的代码:
public partial class rptEngOrd : Form
{
public rptEngOrd()
{
InitializeComponent();
}
private List<EngOrd> eoNumParam;
private string eonum;
private DataSet dsReport;
private DataSet dsSubReport;
private void rptEngOrd_Load(object sender, EventArgs e)
{
LoadComboBoxes();
}
private void LoadComboBoxes()
{
try
{
eoNumParam = EngOrdDB.GetDistinctEONum();
cboEONum.DataSource = eoNumParam;
cboEONum.SelectedIndex = -1;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.GetType().ToString());
}
}
private void btnPreview_Click(object sender, EventArgs e)
{
try
{
if (cboEONum.SelectedValue.ToString().Equals("zALL"))
{
eonum = "";
}
else
{
eonum = cboEONum.SelectedValue.ToString();
}
//get the data
dsReport = EngOrdDB.GetEngOrdbyEONum(eonum);
//provide local report information to viewer
reportViewer1.LocalReport.ReportEmbeddedResource = "CustomMenu.rptEngOrd.rdlc";
reportViewer1.ProcessingMode = ProcessingMode.Local;
//prepare report data source
ReportDataSource rds = new ReportDataSource();
rds.Name = "dsReport";
rds.Value = dsReport.Tables[0];
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(rds);
//prepare sub report data source
dsSubReport = EngOrdTaskDB.GetEngOrdTaskbyEONum(eonum);
ReportDataSource rdsSub = new ReportDataSource();
rdsSub.Name = "dsSubReport";
rdsSub.Value = dsSubReport.Tables[0];
reportViewer1.LocalReport.DataSources.Add(rdsSub);
reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(srptProcessingEventHandler);
//load the report viewer
reportViewer1.LocalReport.Refresh();
//MessageBox.Show(eonum);
}
catch (Exception ex)
{
//display generic message back to user
MessageBox.Show(ex.Message);
}
finally
{
}
reportViewer1.RefreshReport();
}
private void srptProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
{
ReportDataSource r = reportViewer1.LocalReport.DataSources[1];
e.DataSources.Add(r);
}
}
我发现了一个帮助我填充子报告数据的链接,根据域模型进行报告,你可以在页面中间找到你感兴趣的代码。
顺便说一下,我认为您应该只在事件处理程序中填充和添加数据
private void srptProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
{
dsSubReport = EngOrdTaskDB.GetEngOrdTaskbyEONum(eonum);
e.DataSources.Add(new ReportDataSource “dsSubReport”, dsSubReport.Tables[0]));
}
然后从单击事件中删除此代码。
//prepare sub report data source
dsSubReport = EngOrdTaskDB.GetEngOrdTaskbyEONum(eonum);
ReportDataSource rdsSub = new ReportDataSource();
rdsSub.Name = "dsSubReport";
rdsSub.Value = dsSubReport.Tables[0];
reportViewer1.LocalReport.DataSources.Add(rdsSub);
这样我就应该工作了。希望这能帮助