1

我有一个在 ReportBuilder 2 中设计的 RDL 文件。我需要在我的 C# 应用程序中显示它。我知道在 gotreportviewer.com 上有一个 RdlViewer 示例,但这不是我真正想要的(例如,它不能处理具有多个值的参数)。相反,我很好奇 ReportBuilder 本身显示报表预览的方式。查看它的安装目录,我发现了几个有趣的 DLL。使用 ILSpy,我看到在 MSReportBuilder.exe 中,有一个名为“StartPreview()”的方法,当您在 ReportBuilder 中单击“运行”按钮时会调用该方法。这是代码:

private void StartPreview()
{
    try
    {
        if (!this.m_layoutEditor.AtBookmark("ReportPreview"))
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                this.m_layoutEditor.CommitPendingChanges(false);
                this.m_preview.Reset();
                Report report;
                if (this.ActiveServer != null)
                {
                    this.m_preview.ProcessingMode = ProcessingMode.Remote;
                    report = this.m_preview.ServerReport;
                    string text = this.ActiveServer.ServerUrl;
                    if (this.ActiveServer.IsInSharePointMode)
                    {
                        text = Util.RemoveTrailingSlash(text) + "/_vti_bin/reportserver";
                    }
                    AuthenticationInfo authenticationInfo = this.ActiveServer.GetAuthenticationInfo();
                    if (authenticationInfo.IsFormsAuth)
                    {
                        this.m_preview.ServerReport.ReportServerCredentials.SetFormsCredentials(authenticationInfo.AuthCookie, authenticationInfo.UserName, authenticationInfo.Password, authenticationInfo.Domain);
                    }
                    this.m_preview.ServerReport.ReportServerUrl = new Uri(text);
                    using (this.m_layoutEditor.UndoManager.BeginTempGroup())
                    {
                        Report rdlObject = this.m_layoutEditor.Report.GetRdlObject();
                        if (this.CurrentReportInfo.IsServerReport)
                        {
                            this.m_reportProject.ResolveServerReferences(rdlObject);
                        }
                        RdlSerializer rdlSerializer = LayoutEditor.CreateSerializer();
                        rdlSerializer.Serialize(memoryStream, rdlObject);
                    }
                    memoryStream.Position = 0L;
                    this.m_preview.ServerReport.LoadReportDefinition(memoryStream);
                    DataSourceCredentials[] storedCredentialsForCurrentReport = this.GetStoredCredentialsForCurrentReport();
                    if (storedCredentialsForCurrentReport.Length > 0)
                    {
                        this.m_preview.ServerReport.SetDataSourceCredentials(storedCredentialsForCurrentReport);
                    }
                }
                else
                {
                    this.m_preview.ProcessingMode = ProcessingMode.Local;
                    report = this.m_preview.LocalReport;
                    using (this.m_layoutEditor.UndoManager.BeginTempGroup())
                    {
                        Report rdlObject2 = this.m_layoutEditor.Report.GetRdlObject();
                        this.m_reportProject.FixUpDataSourceCredentialsForLocalPreview(rdlObject2);
                        RdlSerializer rdlSerializer2 = LayoutEditor.CreateSerializer();
                        rdlSerializer2.Serialize(memoryStream, rdlObject2);
                    }
                    memoryStream.Position = 0L;
                    this.m_preview.LocalReport.LoadReportDefinition(memoryStream);
                    DataSourceCredentials[] storedCredentialsForCurrentReport2 = this.GetStoredCredentialsForCurrentReport();
                    if (storedCredentialsForCurrentReport2.Length > 0)
                    {
                        bool flag;
                        this.m_preview.LocalReport.GetDataSources(out flag);
                        if (!flag)
                        {
                            this.m_preview.LocalReport.SetDataSourceCredentials(storedCredentialsForCurrentReport2);
                        }
                    }
                }
                report.DisplayName = this.CurrentReportInfo.ReportName;
                this.m_preview.RefreshReport();
                this.m_layoutEditor.SetBookmark("ReportPreview");
            }
        }
    }
    catch (Exception ex)
    {
        string message;
        this.m_reportProject.ParseException(ex, out message);
        ErrorDialog.Show(this, Strings.Error_Preview, message, ex);
        this.SetDisplayMode(DisplayMode.Design);
    }
}

有趣的一点是,服务器端处理的代码非常清晰。但我无法理解客户端处理(我的需要)是如何工作的!你能帮我在我的申请中做同样的事情吗?

我正在使用 VS 2010 / .Net 4.0

4

0 回答 0