私は SQL Server 2008 と C# を使用しており、データベース テーブル (従業員の詳細) にイメージパスを保存しており、データセットを介してこのテーブルを Crystal Report にバインドしています。では、Crystal Report の各レコードに写真をバインドするにはどうすればよいでしょうか?
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 フィールドにバイト ストリームとして保存し、そのデータセットをレポートに提供することです。path
image
image
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 があることを確認してください。ここに記述したコードは基本的なものです。これを理解するのに何の問題もないはずです。 元のソース
私はあなたがこれを見ることができると思う..
http://dotnetbd.wordpress.com/2008/06/20/display-dynamic-image-in-crystal-report-net/