0

私は SQL Server 2008 と C# を使用しており、データベース テーブル (従業員の詳細) にイメージパスを保存しており、データセットを介してこのテーブルを Crystal Report にバインドしています。では、Crystal Report の各レコードに写真をバインドするにはどうすればよいでしょうか?

4

2 に答える 2

2

ユーザーが自分の Crystal レポートに画像をアップロードするのに苦労している人がいかに多いかを知り、この記事を書くことにしました。たとえば、ユーザーが自分のロゴを変更したり、Crystal レポートにアップロードしたりしたいとします。どうすればこれを行うことができますか?開発者はこの機能をユーザーにどのように提供できますか?

ユーザーが Crystal レポートをあまりカスタマイズできないことは誰もが知っています。Crystal レポートが生成されると、ユーザーはフィールドを自由に変更することができなくなります。この記事では、ユーザーが 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 フィールド:

Crystal レポートに画像を追加するには (画像フィールドがデータベースからのものであることを考慮して)、スキーマに BLOB フィールドが必要です。イメージ、ドキュメント、またはさまざまなカスタム タイプをデータベースに保存する場合は、BLOB フィールドを使用します。BLOB は Binary Large Object の略です。

<xs:element name="path" type="xs:string" minOccurs="0" />
<xs:element name="image" type="xs:base64Binary" minOccurs="0" />

このスキーマを調べると、 というテーブルととImagesの 2 つの列があることがわかります。列は Base64 Binary 型です。これが BLOB フィールドです。このプログラムで行うことは、ユーザーがアップロードする画像を選択したときに、その画像を BLOB フィールドにバイト ストリームとして保存し、そのデータセットをレポートに提供することです。pathimageimage

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[]。これはかなり簡単です。2 つの列を持つテーブルを作成するだけです。次に、それをデータセットに追加します。これで、次の行を使用してスキーマを作成できます。

this.DsImages.WriteXmlSchema(@"c:\temp\ImagesSchem a.xsd");

スキーマの準備ができたら、Crystal レポートに提供できます。

フィールド エクスプローラーでは、Images テーブルと、パスとイメージの 2 つの列を確認できます。画像列をレポートにドラッグすると、そのフィールドのタイプが であることがわかります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 フィールドにバイト ストリームとして保存します。
  • BLOB フィールドを含むレポートにデータセットを提供します。
  • レポートは、バイト ストリームを画像に変換して表示します。

結論:

この例を使用して、ユーザーがレポートにアップロードする画像をカスタマイズできるようにします。これは、ユーザーがレポートの画像を変更したり、ロゴを自分でアップロードしたりしたい場合などに適した実装です。レポートの画像を変更するたびに、ソフトウェア開発チームに連絡する必要はありません。レポート全体でフィールドを移動したり、新しいフィールドを追加したりする場合、ユーザー側で Crystal レポートをカスタマイズすることはできません。この記事は、実行時にイメージをアップロードする方法を理解するのに役立ちます。実行時に Crystal レポートをカスタマイズする方法については説明していません。この記事のコンセプトを理解していただければ幸いです。

このプログラムをダウンロードして試してみてください。Crystal Reports 11 があることを確認してください。ここに記述したコードは基本的なものです。これを理解するのに何の問題もないはずです。 元のソース

于 2013-01-08T11:00:45.317 に答える
2

私はあなたがこれを見ることができると思う..

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

于 2011-04-15T11:04:14.533 に答える