Visual Studio LocalReport Объект и ReportViewer - PullRequest
2 голосов
/ 17 января 2012

Есть ли способ обработать объект LocalReport (выполнил эту часть) и отобразить его после элемента управления ReportViewer в другой форме?Идея состоит в том, чтобы печатать без ReportViewer (уже сделано), но, если пользователь хочет, может также просмотреть, что он собирается напечатать.

Я использую Visual Basic .NET SDK 3.5 и Visual Studio 2008.Можно также использовать 2010, если это необходимо.

Я пытался сделать что-то вроде этого:

ReportViewer1.LocalReport = myLocalReport 

, но без удачи, поскольку свойство LocalReport в ReportViewer доступно только для чтения ...

Любая подсказка наэтот?Заранее спасибо.

(Я знаю, что для этого нужно выполнить метод ReportViewer1.LocalReport. Все, что мне нужно, - это создать отдельный код и привязать его либо непосредственно к принтеру, либо к форме предварительного просмотра)

Ответы [ 2 ]

0 голосов
/ 15 января 2013

У меня была похожая ситуация с вами, когда у меня были службы, которые могут создавать локальный отчет, который затем можно было бы создать в PDF, отправить по электронной почте и т. Д. Однако, поскольку ReportViewer.LocalReport - свойство только для чтения, мне пришлось либо дублироватькод, используемый для построения отчета или копирования значений из моего LocalReport в ReportViewer.LocalReport.Я не являюсь поклонником любого варианта, потому что либо что-то может не копироваться (то есть событие подотчетности), либо есть дублирование кода.

Я придумал следующее расширение, которое устанавливает LocalReport для ReportViewer с отражением,Я не полностью проверил это, и это может быть плохой идеей!Тем не менее, похоже, что это работает для проекта, над которым я сейчас работаю.Я понятия не имею, выполняет ли ReportViewer какую-либо дополнительную инициализацию своего локального отчета, чтобы что-то могло взорваться ....

Я НЕ МОГУ СТРАХОВАТЬ ЭТО ДОСТАТОЧНО - ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК - ВЕРОЯТНО НЕХОРОШАЯ ИДЕЯ ДЛЯ ЭТОГО

public static class ReportViewerExtensions
{
    public static void SetLocalReport(this ReportViewer reportViewer, LocalReport report)
    {
        var currentReportProperty = reportViewer.GetType().GetProperty("CurrentReport", BindingFlags.NonPublic | BindingFlags.Instance);
        if (currentReportProperty != null)
        {
            var currentReport = currentReportProperty.GetValue(reportViewer, null);
            var localReportField = currentReport.GetType().GetField("m_localReport", BindingFlags.NonPublic | BindingFlags.Instance);
            if (localReportField != null)
            {
                localReportField.SetValue(currentReport, report);
            }
        }
        reportViewer.RefreshReport();
    }
}

Использование:

LocalReport localReport = reportService.GenerateCurrentOrdersReport(....);
reportViewer.SetLocalReport(localReport);
0 голосов
/ 29 января 2012

LocalReport доступен только для чтения, но ReportPath и ReportEmbeddedResource являются настраиваемыми

Попробуйте что-то вроде этого или, если ваш отчет не внедрен, попробуйте установить свойство ReportPath LocalReport

reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("GravatomsReportRegister", GravatomsFullInfoByIdBindingSource));
            reportViewer1.LocalReport.ReportEmbeddedResource = "Gravatun.GraviGrancumReport.rdlc";
            reportViewer1.RefreshReport();
...