2013-12-10 35 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); 

這樣我就應該工作了。希望這可以幫助