2013-04-01 76 views
4

我有一个本地.rdlc报告用于单击按钮显示,但由于某种原因报告仅显示在第二次按钮单击事件中。我不知道为什么报告没有显示在第一次点击按钮上......这是我在按钮的点击事件上调用的函数。SQL Reporting Services报告仅在第二次点击时加载

private void ShowReport(string accountingCompanyId, string companyId, string approvalUnitId, DateTime startDate, DateTime finishDate, string supplierId, 
        string documentNumber, string documentType, string documentState, string costCenterId, string chargingKeyId, 
        string dim1Value, string dim1Description, string dim1Id, string dim2Value, string dim2Description, string dim2Id, 
        string dim3Value, string dim3Description, string dim3Id, bool showDetails) { 

     //this.ReportViewer1.Reset(); 

     //Set report mode for local processing. 
     this.ReportViewer1.ProcessingMode = ProcessingMode.Local; 

     ISettingsReader settingsReader = SettingsReaderFactory.Instance.CreateSettingsReader(); 
     this.ReportViewer1.LocalReport.ReportPath = settingsReader.GetSetting("ReportViewer", "FinancialReportPath" + (showDetails ? "" : "Small"), true, null); 

     ReportsBL reports = new ReportsBL(); 

     // Clear out any previous datasources. 
     this.ReportViewer1.LocalReport.DataSources.Clear(); 

     // Load the company dataSource. 
     DataTable company = reports.GetCompanyDataSet(accountingCompanyId).Tables[0]; 
     ReportDataSource dataSourceCompany = new ReportDataSource(company.TableName, company); 
     this.ReportViewer1.LocalReport.DataSources.Add(dataSourceCompany); 

     // Load the dataSource. 
     DataTable report = reports.GetReportFinanceiroSmallDataSet(companyId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, approvalUnitId, documentState, accountingCompanyId).Tables[0]; 
     ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report); 
     this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport); 

     this.ReportViewer1.LocalReport.Refresh(); 

     this.pnlReport.Visible = true; 
    } 

奇怪的是,如果我取消注释行this.ReportViewer.Reset();那么无论我生成的点击次数如何,报告都将永远不会显示出来......是否有人知道这是否正常?如何解决这个问题? 在此先感谢,

回答

2

经过大量的试验和错误,我通过调用pageload事件的databind()方法来实现它。在页面加载数据绑定(未设置数据源)后,后续的按钮点击按钮开始按预期工作。

我被包含在其他人遇到此错误的情况下。 (很想知道为什么我需要在页面加载数据绑定,虽然...)

更新2

我终于想通了这个问题...原来,.rdlc是从一个旧2005年迁移.rdl报告,并且新的.rdlc包含旧的报告参数+ sql,它以某种方式搞乱了报告加载。之后我删除未使用的报告parameteres + SQL一切都开始完美的工作......我已经更新了代码波纹管,以反映我现在用在我的项目...

protected void Page_Load(object sender, System.EventArgs e) { 

} 

protected void btGenStats_Click(object sender, System.EventArgs e) { 

    ... 

    this.ShowReport(accountingCompanyId, companyId, approvalUnitId, startDate, finishDate, supplierId, documentNumber, documentType, documentState, 
        costCenterId, chargingKeyId, dim1, dim1Desc, dim1Id, dim2, dim2Desc, dim2Id, dim3, dim3Desc, dim3Id, showDetails); 
} 

private void ShowReport(string accountingCompanyId, string companyId, string approvalUnitId, DateTime startDate, DateTime finishDate, string supplierId, string documentNumber, string documentType, string documentState, string costCenterId, string chargingKeyId, string dim1Value, string dim1Description, string dim1Id, string dim2Value, string dim2Description, string dim2Id, string dim3Value, string dim3Description, string dim3Id, bool showDetails) { 

    this.ReportViewer1.Reset(); 

    //Set report mode for local processing. 
    this.ReportViewer1.ProcessingMode = ProcessingMode.Local; 

    ISettingsReader settingsReader = SettingsReaderFactory.Instance.CreateSettingsReader(); 
    string reportPath = settingsReader.GetSetting("ReportViewer", "FinancialReportPath"+(showDetails? "" : "Small"), true, null); 
    this.ReportViewer1.LocalReport.ReportPath = Server.MapPath(reportPath); 

    ReportsBL reports = new ReportsBL(); 

    // Clear out any previous datasources. 
    this.ReportViewer1.LocalReport.DataSources.Clear(); 

    // Load the company dataSource. 
    DataTable company = reports.GetCompanyDataSet(accountingCompanyId).Tables[0]; 
    ReportDataSource dataSourceCompany = new ReportDataSource(company.TableName, company); 
    this.ReportViewer1.LocalReport.DataSources.Add(dataSourceCompany); 

    if (showDetails) 
    { 
     // Load the dataSource. 
     DataTable report = reports.GetReportFinanceiroDataSet(companyId, approvalUnitId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, documentState, accountingCompanyId).Tables[0]; 
     ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report); 
     this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport); 
    } 
    else 
    { 
     // Load the dataSource. 
     DataTable report = reports.GetReportFinanceiroSmallDataSet(companyId, approvalUnitId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, documentState, accountingCompanyId).Tables[0]; 
     ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report); 
     this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport); 
    } 

    this.pnlReport.Visible = true; 
} 
3

我想问题可能是在呈现页面后点击事件。尝试调用Page_Load事件中的方法。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsCallback) 
    { 
     ShowReport(
      // params 
     ); 
    } 
} 

如果这有效,你知道它与执行顺序有关。

1
protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      string pstrType; 
      pstrType = Request.QueryString["Type"];   
      LoadReport(); 
     } 

     public class CustomReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials 
     { 
      // local variable for network credential. 
      private string _UserName; 
      private string _PassWord; 
      private string _DomainName; 
      public CustomReportCredentials(string UserName, string PassWord, string DomainName) 
      { 
       _UserName = UserName; 
       _PassWord = PassWord; 
       _DomainName = DomainName; 
      } 
      public System.Security.Principal.WindowsIdentity ImpersonationUser 
      { 
       get 
       { 
        return null; // not use ImpersonationUser 
       } 
      } 
      public System.Net.ICredentials NetworkCredentials 
      { 
       get 
       { 
        // use NetworkCredentials 
        return new NetworkCredential(_UserName, _PassWord, _DomainName); 
       } 
      } 
      public bool GetFormsCredentials(out Cookie authCookie, out string user, out string password, out string authority) 
      { 
       // not use FormsCredentials unless you have implements a custom autentication. 
       authCookie = null; 
       user = password = authority = null; 
       return false; 
      } 
     } 

     void LoadReport() 
     { 
      string strCompanyName = objSession.SelCompanyName; 
      string strHeading = ""; 
      string strBranchName = objSession.SelBranchName; 
      rptvwMain.ProcessingMode = ProcessingMode.Remote; 
      rptvwMain.ServerReport.ReportServerCredentials = new CustomReportCredentials(AppConfig.ReportServerUserName, AppConfig.ReportServerPassword, AppConfig.ReportServerDomain); 
      string strReportServerUrl = AppConfig.ReportServerUrl + AppConfig.ReportServerFolder; 
      rptvwMain.ServerReport.ReportServerUrl = new Uri(strReportServerUrl); 
      List<ReportParameter> parameters = new List<ReportParameter>(); 
    if (pstrType == "OB") 
      { 
       strHeading = "Ledger Opening Balance"; 
       rptvwMain.ServerReport.ReportPath = "/Account/OpeningBalance"; 
      } 


      parameters.Add(new ReportParameter("FyId", Convert.ToInt16(objSession.FyId).ToString())); 
      parameters.Add(new ReportParameter("AccountGroupId", cmbAccountGroup.SelectedValue)); 
      parameters.Add(new ReportParameter("LedgerId", cmbLedgerId.SelectedValue)); 
      parameters.Add(new ReportParameter("BranchId", Convert.ToInt64(objSession.BranchId).ToString())); 
      parameters.Add(new ReportParameter("StDate", Convert.ToDateTime(RadDtpFromDate.SelectedDate).ToString())); 
      parameters.Add(new ReportParameter("EnDate", Convert.ToDateTime(RadDtpToDate.SelectedDate).ToString())); 
      parameters.Add(new ReportParameter("CompanyName", strCompanyName.ToString())); 
      parameters.Add(new ReportParameter("BranchName", strBranchName.ToString())); 
      parameters.Add(new ReportParameter("Heading",strHeading.ToString())); 
      rptvwMain.ServerReport.SetParameters(parameters); 

      rptvwMain.ServerReport.SetDataSourceCredentials(new[] { new DataSourceCredentials() { Name =AppConfig.ReportServerDataSource , UserId = AppConfig.ReportServerDSUserName, Password = AppConfig.ReportServerDSPassword } }); 
      rptvwMain.ShowZoomControl = true; 
      rptvwMain.ServerReport.Refresh(); 
     } 
    } 

试试看这个代码........ 可能这段代码对你有帮助??????

2

我从来没有到调用ReportViewer.DataBind();以下是我通常所做的:

IEnumerable<ReportClass> ds = DataTranslator.GetReportData(Int64.Parse(<someId>)); 
report.LocalReport.ReportPath = "<some_path_to_report.rdlc>"; 
report.LocalReport.DataSources.Add(new ReportDataSource("DataSet", ds)); 
report.Visible = true; 
report.LocalReport.Refresh(); 
+0

但是,您在pageload方法上执行此操作,或者您使用onclick方法执行此操作?你使用什么版本的ReportViewer? –

+0

我通过回发控件调用该方法。我特意从DropDownList_SelectedIndexChanged事件中抽取这个。我正在使用ReportViewer.WebForms版本10.0.0.0。 – m4chine

相关问题