Как мы можем обойти неспособность ReportViewer использовать отчеты из другого проекта? - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время я работаю над проектом C # для колледжа, где мне необходимо применить N-уровневую архитектуру с 5 уровнями:

  • Доступ к данным
  • Уровень SQL
  • Бизнес-уровень
  • Внешний интерфейс рабочего стола
  • Веб-интерфейс

Одним из требований проекта является отображение отчетов.

Я выбралиспользовать отчеты ReportViewer и RDLC для достижения этой цели.Мой выбор работал нормально, пока я не достиг финальной итерации проекта.

До этой итерации мне нужно было только генерировать отчеты из приложения Desktop, а отчет RDLC находился внутри моего проекта приложения Desktop.Теперь мне нужно сгенерировать отчет по ASP.Net WebForm.

Поскольку доступ к отчету должен осуществляться двумя разными проектами, я подумал, что все, что мне нужно было сделать, это переместить отчет RDLC на уровень, на мой бизнес-уровень (вероятно, в любом случае, должен был быть там, к сожалению).Конечно, я столкнулся с проблемами.Это никогда не было так просто, не правда ли?

После некоторого поиска я обнаружил 2 конкретных полезных сообщения:

  1. Reportviewer и отчет находятся в разных проектах в одном решении.Как мне прикрепить отчет к зрителю
  2. https://forum.inductiveautomation.com/t/displaying-a-report-over-multiple-projects/12825

В первом посте все, что мне нужно будет сделать, это установить Copy to Output Directory моегоДля файла RDLC Copy always, а затем для ReportViewer.LocalReport.ReportPath укажите имя файла rdlc с расширением ("example.rdlc").

К сожалению, этот ответ никогда не работал ни для меня, ни для ОП.Почему это не сработало, было объяснено во втором посте:

Средство просмотра отчетов не может просматривать отчет из другого проекта, хотя это может сделать хороший запрос функции.- adam.morales

Затем я попробовал что-то немного другое.Вместо того, чтобы обращаться к отчету с помощью ReportPath из другого проекта, почему бы мне не создать на своем бизнес-уровне свойство, которое будет возвращать LocalReport, у которого уже есть определение отчета?К сожалению, ReportViewer.LocalReport только для чтения.Даже если бы это было доступно для записи, я не удивился бы, если бы это не решило проблему;потому что ReportPath является строкой, и проблема, вероятно, возникает, когда LocalReport пытается выполнить рендеринг.

Это создает для меня очень большую проблему.Недостаточно времени, чтобы полностью переделать отчеты, и я не хочу прибегать к использованию 2 разных файлов RDLC, по одному для каждого внешнего проекта;потому что это плохой дизайн.

Чтобы быть полностью понятным в моих потребностях:

  • Мне нужно иметь доступ к отчету RDLC из 2 разных проектов
  • Iдолжен следовать N-уровневой архитектуре и поддерживать повторное использование кода

Итак, вот почему я спрашиваю, какой обходной путь я мог бы попытаться решить эту проблему?

1 Ответ

0 голосов
/ 13 мая 2018

Что ж, лучшее, что я смог найти, - это вставить PDF в WinForms. Кажется, для этого нужны сторонние библиотеки DLL, чего я пытался избежать; потому что это проект колледжа.

Пока это еще не проверено ... Метод LocalReport.Render может генерировать PDF (среди множества вещей) как Byte[]. Если я использую метод Render внутри моего бизнес-уровня; тогда я ожидал бы, что это сработает, поскольку LocalReport будет выполнять свою собственную работу, находясь в том же проекте, что и файл RDLC, и для этой работы.

После этого я смогу просто вернуть сгенерированный отчет и использовать его там, где захочу.

К сожалению, я не хочу вдаваться в сложность добавления сторонних библиотек в проект колледжа, поэтому я собираюсь просто дублировать файлы RDLC ... Ненавижу решение; но это то, что есть.

...