2013-12-10 49 views
0

我想获得一个子报表工作。我正在使用VS 2010.我在主报告中插入了一个“Subreport1”,并不断收到错误:子报表'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); 

    }  

} 
+0

对此有什么想法? – maverick07281975

回答

4

我发现而走这条链接,帮助我与子报表数据群,Reporting against a domain model,你会发现你感兴趣的关于在页面中间的代码。

通过我认为你应该填充并且仅在事件处理程序

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); 

这样我就应该工作了。希望这可以帮助