Как отобразить фотографию с Crystal Report? - PullRequest
0 голосов
/ 25 июня 2010

Я использую SQL Server 2008 и C #, я храню imagepath в своей таблице базы данных (данные сотрудника) и связываю эту таблицу с Crystal Report через набор данных. Теперь, как я могу связать фотографию с каждой записью в Crystal Report?

Ответы [ 2 ]

2 голосов
/ 08 января 2013

Я решил написать эту статью после того, как понял, у скольких людей возникли проблемы с предоставлением пользователю возможности загружать изображения в свой отчет 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. Код, который я здесь написал, является базовым. У вас не должно быть проблем с пониманием этого. оригинальный источник

2 голосов
/ 15 апреля 2011

Я думаю, вы можете посмотреть на это ..

http://dotnetbd.wordpress.com/2008/06/20/display-dynamic-image-in-crystal-report-net/

...