2013-04-01 8 views
4

У меня есть локальный отчет .rdlc, который можно отобразить нажатием кнопки, но по какой-то причине отчет отображается только во время события 2-го нажатия кнопки. Я понятия не имею, почему отчет не отображается при первом нажатии кнопки ... Это функция, которую я вызываю при нажатии кнопки кнопки.Отчеты служб 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

После большого количества проб и ошибок я получил его работу, вызвав метод databind() в событии pageload. После привязки данных pageload (без набора данных) последующее нажатие кнопки начинает работать как ожидалось.

Я включил код в случае, если кто-то еще встречает эту ошибку. (Очень хотелось бы знать, почему мне нужно привязка в PageLoad, хотя ...)

Update 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

Смежные вопросы