Я решил написать эту статью после того, как понял, у скольких людей возникли проблемы с предоставлением пользователю возможности загружать изображения в свой отчет Crystal.Скажем для примера, если пользователь хочет изменить или загрузить свой логотип в отчет Crystal.Как ты можешь это сделать?Как разработчики могут предоставить эту возможность пользователям?
Мы все знаем, что пользователи не могут настраивать отчеты Crystal.После того, как отчет Crystal Report сформирован, у пользователей практически нет выбора для изменения полей по своему усмотрению.В этой статье будет продемонстрировано, как пользователь может загрузить или изменить изображение в отчете Crystal.
На самом деле это очень простой пример.Даже если у вас есть начинающие знания о отчетах Crystal, вы сможете понять, как это работает.Я использую Crystal Reports 11. Для этой демонстрации.
Чтобы начать с самого начала, создайте новое приложение Windows и добавьте средство просмотра отчетов Crystal и кнопку обзора.
Эта кнопка обзора позволитПользователь, чтобы добавить изображение в отчет.Добавьте отчет Crystal в ваш проект.
Схема отчета:
Мы все знаем, что нам нужно предоставить схему для отчета Crystal.Вот XML-представление схемы отчета, которую мы собираемся предоставить для отчета.
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-
microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="en-AU">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Images">
<xs:complexType>
<xs:sequence>
<xs:element name="path" type="xs:string" minOccurs="0" />
<xs:element name="image" type="xs:base64Binary" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
Поле BLOB:
Чтобы добавить изображение в отчет о кристалле (учитывая, что поле изображения поступает из базы данных), нам нужно иметьПоле BLOB в схеме.Если вы хотите хранить изображения, документы или другие пользовательские типы в базе данных, вы используете поле BLOB.BLOB означает Большой двоичный объект.
<xs:element name="path" type="xs:string" minOccurs="0" />
<xs:element name="image" type="xs:base64Binary" minOccurs="0" />
Если вы осмотрите эту схему, мы увидим, что у нас есть таблица с именем Images
и два столбца path
и image
.image
столбец типа Base64 Binary.Это наше поле BLOB.Что мы собираемся сделать в нашей программе, когда пользователь выбирает изображение для загрузки, мы сохраняем это изображение в поле BLOB в виде потока байтов, а затем передаем этот набор данных в отчет.
CreateTable()
методпокажет, как сгенерировать эту схему в программе.
Генерация схемы для отчета:
Существуют и другие способы создания схемы, но это даст вам более четкое представление о столбце.поля.
Создание таблицы:
private void CreateTable()
{
//create a new data set.
this.DsImages = new DataSet();
//create a new table with two columns and add the table to the dataset
DataTable ImageTable = new DataTable("Images");
//in here the "path" column is not really needed. Image column is just enough.
ImageTable.Columns.Add(new DataColumn("path",typeof(string)));
//Important note
//Note the type of the image column. You want to give this column as a blob field to the crystal report.
//therefore define the column type as System.Byte[]
ImageTable.Columns.Add(new DataColumn("image",typeof(System.Byte[])));
this.DsImages.Tables.Add(ImageTable);
}
Если вы заметите столбец image
, вы увидите, что тип этого столбца - System.Byte[]
.Это довольно просто.Просто создайте таблицу с двумя столбцами.Затем добавьте его в набор данных.Теперь вы можете создать схему, используя следующую строку:
this.DsImages.WriteXmlSchema(@"c:\temp\ImagesSchem a.xsd");
Как только мы подготовим схему, мы сможем предоставить ее в отчет Crystal.
В полевом проводнике мы можем увидеть таблицу изображений ипуть двух столбцов и изображение.При перетаскивании столбца изображения в отчет вы можете увидеть тип этого поля IBlobFieldObject
.Эти поля будут читать поток байтов и преобразовывать его обратно в изображение.Итак, наша задача в значительной степени выполнена.Приведенный ниже код показывает, как можно сохранить изображение в виде потока байтов в поле BLOB.
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
//get the image file into a stream reader.
FileStream FilStr = new FileStream(this.openFileDialog1.FileName, FileMode.Open);
BinaryReader BinRed = new BinaryReader(FilStr);
//Adding the values to the columns
// adding the image path to the path column
DataRow dr = this.DsImages.Tables["images"].NewRow();
dr["path"] = this.openFileDialog1.FileName;
//Important:
// Here you use ReadBytes method to add a byte array of the image stream.
//so the image column will hold a byte array.
dr["image"] = BinRed.ReadBytes((int)BinRed.BaseStream.Length);
this.DsImages.Tables["images"].Rows.Add(dr);
FilStr.Close();
BinRed.Close();
//create the report object
DynamicImageExample DyImg = new DynamicImageExample();
// feed the dataset to the report.
DyImg.SetDataSource(this.DsImages);
this.crystalReportViewer1.ReportSource = DyImg;
}
catch(Exception er)
{
MessageBox.Show(er.Message,"Error");
}
}
Вы записываете это в методе FileOk
openFileDialog
.Вы используете метод BinaryReader.ReadBytes
для чтения байтового массива.
dr["image"] = BinRed.ReadBytes((int)BinRed.BaseStream.Length);
Если вы осмотрите эту строку кода, вы увидите, что мы присвоили байтовый массив в столбце image
таблицы.Этот байтовый массив является изображением, которое выбрал пользователь.Поэтому, когда вы передаете этот набор данных в отчет Crystal, IBlobFieldObject
в отчете преобразует этот байтовый массив обратно в изображение.
Это все, что вам нужно понять в этой программе.Ниже я перечислил все важные шаги, которые вам необходимо понять.
- Пользователь выбирает изображение.
- Мы сохраняем изображение в поле большого двоичного объекта в виде потока байтов.
- Предоставить набор данных для отчета, который содержит поле BLOB.
- Отчет преобразует поток байтов обратно в изображение и показывает его.
Вывод:
Используя этот пример, мы можем дать пользователю возможность настраивать изображения, которые он хочет загрузить в отчет. Это было бы хорошей реализацией в ситуациях, например, если пользователи хотят изменить изображения в отчете или загрузить свои логотипы самостоятельно. Пользователям не нужно связываться со своей командой разработчиков программного обеспечения каждый раз, когда они хотят изменить изображение в отчете. Настройка кристаллического отчета на стороне пользователя невозможна, когда речь идет о перемещении полей по отчету или добавлении новых полей. Эта статья только поможет вам понять, как вы можете загрузить изображение во время выполнения. Это не говорит о том, как вы можете настроить отчет Crystal во время выполнения. Я надеюсь, что вы поняли концепцию этой статьи.
Просто скачайте эту программу и попробуйте. Убедитесь, что у вас есть Crystal Reports 11. Код, который я здесь написал, является базовым. У вас не должно быть проблем с пониманием этого.
оригинальный источник