Динамический вывод картинок в отчётах Crystal Report на C#
В данной публикации я расскажу каким образом в отчёт Crystal Report можно вывести требуемое количество изображений (например из базы данных).
!!! Для того чтобы публикация была понятна, рекомендуется к обязательному прочтению предыдущая статья Используем Crystal Report в C#.
Собственно, перепробовав много методов (в основном описанных на зарубежных сайтах — в Ру-нете как то не особо изучен этот вопрос), нашёл действительно работоспособный и эффективный метод вывода изображений в отчёт Crystal Report, который заключается в передаче изображений в отчёт через источник данных.
Для того чтобы передать таким способом изображения мы просто создаём DataTable, в котором одному из столбцов (можно и нескольким) задаём тип данных массив байт — «System.Byte[]». Далее просто добавляем в ячейки этого поля изображения преобразовав их в массив Byte[].
Пример создания такого источника данных (DataSet):
//Создаём новый источник данных
DataSet myDS = new DataSet();
//Создаём новую таблицу
DataTable table = new DataTable("ImageTable");
//Создаём столбец
DataColumn column = new DataColumn("MyImage");
//Задаём тим данных массив byte для ячеек столбца
column.DataType = System.Type.GetType("System.Byte[]");
column.AllowDBNull = true;
column.Caption = "My Image";
//Добавляем созданный столбец в таблицу
table.Columns.Add(column);
//Создаём запись к таблице (строку)
DataRow row = table.NewRow();
//Получаем из файла изображение и преобразуем его в массив байт
FileStream fs = new FileStream("путь до файла изображения.bmp", FileMode.Open);
BinaryReader br = new BinaryReader(fs);
int length = (int)br.BaseStream.Length;
byte[] m_Bitmap = new byte[length];
m_Bitmap = br.ReadBytes(length);
br.Close();
fs.Close();
//добавляем в ячейку полученный m_Bitmap;
row["MyImage"] = m_Bitmap;
//Добавляем запись в таблицу.
table.Rows.Add(row);
myDS.Tables.Add(table);
//Записываем источник данных в XML
myDS.WriteXml(@".\dataset.xml",XmlWriteMode.WriteSchema);
!!! Обратите внимание на XmlWriteMode.WriteSchema — без этого параметра, при добавлении источника данных в конструкторе отчёта редактор не поймёт что в полях изображения, потому что схема данных не сохранится!
После этого мы можем создать форму отчёта и добавить в неё полученный источник данных в виде XML файла: Левой кнопкой по «Database Fields» затем Database Expert -> Database Files (выбираем созданный нашим проектом XML файл).
Вот как это будет выглядеть (при перетаскивании поля на форму будут отображаться изображения из таблицы, в моём случае одно изображение, можно передавать наборы и связывать их с данными):
Созданную отчётную форму в дальнейшем можем использовать и передавать ей изменённый источник данных таким способом:
ReportDocument myReport = new ReportDocument();
//Загружаем форму отчёта
myReport.Load(@".\CrystalReport1.rpt");
DataSet myDS = new DataSet();
//Указываем источнику данных вновь сформированный XML файл.
myDS.ReadXml(@".\dataset.xml");
//Указываем отчёту откуда брать данные.
myReport.SetDataSource(myDS);
//Создаём форму на которой лежит crystalReportViewer!
Form2 frm = new Form2();
//Указываем отчёт для CrystalReportViewer
frm.crystalReportViewer1.ReportSource = myReport;
//Открываем форму.
frm.Show();
!!! В дальнейшем источник данных нет необходимости сохранять на диск, на диск мы его сохраняли только для того чтобы с комфортом создать отчётную форму в которой структура данных будет полностью совпадать с той которую мы будем передавать отчёту из приложения.
Вот результат работы примера (я менял только одну картинку в заголовке, однако этим методом можно передавать и наборы изображений связанных с данными, как я уже ранее упоминал):
Скачать исходный код примера можно здесь:
Скачать файл: reportimage.rar [736.1 Kb] (cкачиваний: 4)
Вот и всё. Вопросы и дельные комментарии приветствуются.