4

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

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(); 那么无论我产生多少点击次数,报告都不会显示...有人知道这是否正常吗?如何解决这个问题?提前致谢,

4

4 回答 4

3

我想问题可能是在呈现页面后触发了 click 事件。Page_Load尝试在事件中调用方法。

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

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

于 2013-04-04T16:19:43.933 回答
2

经过大量试验和错误后,我通过在 pageload 事件上调用 databind() 方法使其工作。在页面加载数据绑定(没有设置数据源)之后,随后的按钮单击开始按预期工作。

我包含代码以防其他人遇到此错误。(很想知道为什么我需要在页面加载中进行数据绑定......)

更新 2

我终于找到了问题所在......原来.rdlc 是从旧的 2005 .rdl 报告迁移而来的,而新的 .rdlc 包含旧的报告参数+sql,这在某种程度上弄乱了报告的加载。在我删除未使用的报告参数 + 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;
}
于 2013-04-10T10:18:55.050 回答
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();
于 2013-04-10T21:38:50.643 回答
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();
        }
    }
于 2013-04-10T05:54:12.457 回答