Visual Studio LocalReport Объект и ReportViewer

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

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

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

ReportViewer1.LocalReport = myLocalReport 

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

Любой намек на это? Заранее спасибо.

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

2 ответа

У меня была похожая ситуация с вами, когда у меня были службы, которые могут создавать локальный отчет, который затем можно было бы создать в 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);

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

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

reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("GravatomsReportRegister", GravatomsFullInfoByIdBindingSource));
            reportViewer1.LocalReport.ReportEmbeddedResource = "Gravatun.GraviGrancumReport.rdlc";
            reportViewer1.RefreshReport();
Другие вопросы по тегам