Установить программно созданный ReportBook как HTML5 ReportSource - PullRequest
0 голосов
/ 20 декабря 2018

Пользователь может выбрать несколько заказов и загрузить все отчеты в одном формате PDF.Мы использовали PdfSmartCopy для объединения отчетов:

protected void Print(int[] order_ids)
{
    byte[] merged_reports;

    using (MemoryStream ms = new MemoryStream())
    using (Document doc = new Document())
    using (PdfSmartCopy copy = new PdfSmartCopy(doc, ms))
    {
        doc.Open();

        foreach (string order_id in order_ids)
        {
            Telerik.Reporting.InstanceReportSource reportSource = new Telerik.Reporting.InstanceReportSource();
            reportSource.ReportDocument = new OrderReport();
            reportSource.Parameters.Add(new Telerik.Reporting.Parameter("order_id", order_id));

            RenderingResult result = new ReportProcessor().RenderReport("PDF", reportSource, new Hashtable());

            using (PdfReader reader = new PdfReader(result.DocumentBytes))
            {
                copy.AddDocument(reader);
            }
        }

        doc.Close();

        merged_reports = ms.ToArray();
    }

    Response.Clear();
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Expires = -1;
    Response.Buffer = false;
    Response.ContentType = "application/pdf";
    Response.OutputStream.Write(merged_reports, 0, merged_reports.Length);
}

Но мы начали использовать HTML5 ReportViewer в другом месте, и мы хотим использовать его там, чтобы быть последовательными.Я подумал о создании ReportBook программно и установил его как ReportSource для ReportViewer, но единственное, что я могу установить, - это строка.Ранее мы уже использовали ReportBook, но это был настоящий SomeReportBook.cs, который мы могли установить с помощью new SomeReportBook().GetType().AssemblyQualifiedName;.

Любая подсказка?Вот что у меня на данный момент:

protected void Print(int[] order_ids)
{
    Telerik.Reporting.ReportBook reportBook = new Telerik.Reporting.ReportBook();

    foreach (string order_id in order_ids)
    {
        Telerik.Reporting.InstanceReportSource reportSource = new Telerik.Reporting.InstanceReportSource();
        reportSource.ReportDocument = new OrderReport();
        reportSource.Parameters.Add(new Telerik.Reporting.Parameter("order_id", order_id));

        reportBook.ReportSources.Add(reportSource); 
    }

    this.ReportViewer.ReportSource = new Telerik.ReportViewer.Html5.WebForms.ReportSource() 
    {
        Identifier = // Can't use reportBook.GetType().AssemblyQualifiedName
    };
}

1 Ответ

0 голосов
/ 13 февраля 2019

Я также довольно долго боролся с этим вызовом;Я хотел бы поделиться в случае, если кто-то еще сталкивается с такой проблемой.Пожалуйста, сделайте это.

1. Создайте класс, который унаследован от - Telerik.Reporting.ReportBook 2. Создайте метод, который загружает все ваши отчеты в ваш класс отчетов, т.е.

this.ReportSources.Add(new TypeReportSource
       {
            TypeName = typeof(Report1).AssemblyQualifiedName
       });
Вызовите метод в конструкторе вашего класса.

используйте следующий код для установки источника средства просмотра отчетов

 var reportSource = new Telerik.ReportViewer.Html5.WebForms.ReportSource();

    reportSource.IdentifierType = IdentifierType.TypeReportSource;
    reportSource.Identifier = typeof(ReportCatalog).AssemblyQualifiedName;//or 
namespace.class, assembly e.g. "MyReports.Report1, MyReportsLibrary"
    reportSource.Parameters.Add("Parameter1", "Parameter1");
    reportSource.Parameters.Add("Parameter2", "Parameter2");
    ReportsViewer1.ReportSource = reportSource;  

Report1 = Недавно созданный класс, которыйнаследуется от Telerik.Reporting.ReportBook

...