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();