2015-07-21 2 views
2

Я создал приложение MDI, которое показывает некоторые DataGridViews на разных дочерних формах, которые рассматриваются как отдельное приложение, поскольку они имеют доступ к различным базам данных.Как делиться и вставлять изображения во многие отчеты RDLC

Эти данные необходимо экспортировать в отчетах PDF. Я использовал компонент ReportViewer внутри новой дочерней формы MDI, и я создал новый проект в решении, который содержит только файлы отчетов RDLC в качестве встроенных ресурсов, связанных с каждым приложением. Это было сделано для того, чтобы избежать доступа к папке пользователя внутри папки программы, содержащей каждый файл .RDLC, из соображений безопасности.

Это файлы/папки структура VS Решение:

Solution 
| 
|_ Classes 
| | 
| |_ Library Project that contains all the classes used for Data Access... 
| 
|_ MDIMain 
| | 
| |_ The main application Project that contains some Core Classes and Forms... 
| 
|_ Reports (A DLL project that doesn't contain .cs code files, but only folders and RDLC reports) 
    | 
    |_ App1 
    | | 
    | |_ Report1.rdlc 
    | |_ Report2.rdlc 
    | |_ ... 
    | 
    |_ App2 
    | 
    |_ Report1.rdlc 
    |_ ... 

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

Глядя на MSDN документации, кажется, что вы 3 вида возможного источника для изображений:

  • «Embedded»: работает только путем встраивания изображения в один файл отчета. Но в моем случае это не действительное решение из-за потери хранилища.
  • «Внешний»: указав URL или путь (что бы я хотел сделать).
  • «База данных»: укажите поле базы данных, содержащее изображение.

Файлы .rdlc передаются и загружаются внутри окон ReportViewer с использованием библиотеки Reports.dll в качестве источника с использованием синтаксиса «folder.filename».

/* 
* reportSource variable is calculated dynamically with the selection on a ComboBox 
* that let the use choose a specific report. 
* The source format is like this: "Reports.AppNameFolder.Report1.rdlc" 
*/ 

string reportSource = cmbReport.SelectedValue.ToString(); 
ReportDataSource rds = new ReportDataSource(""); 
rds.Name = "DataSet"; 
rds.Value = _reportDataTable; 

Assembly assembly = Assembly.LoadFrom("Reports.dll"); 
UnmanagedMemoryStream reportStream = (UnmanagedMemoryStream)assembly.GetManifestResourceStream(reportSource); 

reportViewer1.LocalReport.DataSources.Clear(); 
reportViewer1.LocalReport.LoadReportDefinition(reportStream); 
reportViewer1.LocalReport.DataSources.Add(rds); 
reportViewer1.RefreshReport(); 

Так что, если я хочу, чтобы создать папку, содержащую мои изображения:

  1. Где я должен поставить его с уверенностью, что тогда папка генерируется вместе с выходом основного проекта ?
  2. Как я могу сделать ссылку на папку и изображения как в режиме отладки, так и в режиме выпуска, поэтому, когда программа будет установлена ​​в пользовательском клиенте?

ответ

2

Вы можете сделать следующее

в свойствах изображений по докладу Источник

  1. Изображения: Встроенная кнопка импорта
  2. нажмите и загрузить изображение

в этом Кстати, RDLC сохранит изображение как base64 внутри файла rdlc, вы можете просмотреть его с помощью редактора xml из решения ex plorer, и не нужно беспокоиться о местоположении изображения.

другой способ, если вы хотите, чтобы загрузить изображение из базы данных, например, вы можете сделать следующее

  1. Изображение Источник: База данных
  2. Используйте это поле: [YourPropertyName]
  3. Используйте этот MIME Тип: изображение/JPEG
  4. в наборе данных отчета, добавьте байт [] столбец или свойство YourPropertyName

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

вы можете это demo я готов показать вам, как достичь этого (для добавления отчета заголовка к вашему текущему отчету)

надеюсь, что это поможет вам

+0

Встраивание изображения внутри каждого отчета не является хорошее решение. Решение для базы данных также не подходит для моего случая. Ваше последнее предложение о подрепорте, используемом как заголовок, может быть действительно, но как мне его реализовать? Я создал новый отчет и добавил к нему логотип. Но тогда я не могу ссылаться на него из других отчетов ... –

+0

@CheshireCat из инструментария перетащить и отложить вложенную отчетность и поместить его в целевой отчет, затем щелкнуть правой кнопкой мыши этот объект subreport (gray) => subreport, а затем поместить имя отчет «HeaderReport», например, под именем и использовать этот отчет в виде текстовых полей подзаголовка, и все готово – Monah

+0

Я не знал о компоненте «Subreport»! Во всяком случае, в моих отчетах есть заголовок страницы, в котором есть логотип, заголовок, субтитр и номер страницы/общего номера. Если я правильно понимаю, 'Subreport' следует использовать как' Panel', который содержит все эти элементы управления TextBox и Image. Но если я попытаюсь перетащить Subreport внутри заголовка страницы, он не сдвинется. Я думаю, что невозможно включить Subreport внутри заголовка отчета ... –