9

レポート ファイルと ReportViewer コントロールを使用して、実行時にオブジェクトからデータを動的にロードするレポートを表示しています。

オブジェクトにバイト配列として格納されている画像を表示する必要があります。

PictureBox の値は現在次のように設定されています。

=First(Fields!ImageData.Value, "dtstItemImage")

そして、次を使用して DataSource を設定します。

ImageBindingSource.DataSource = this.item.Image.ImageData;

コードはコンパイルおよび実行されますが、イメージはレポートに表示されません

これは、PictureBox を (バイト配列ではなく) Image オブジェクトにバインドする必要があるためですか? それとも、設定する必要がある PictureBox のプロパティがいくつかありますか?

更新 1

PictureBox に境界線を追加して、それが表示され、レポートに表示されるようにしました。画像が含まれていないだけです。

更新 2

コードの間違いを修正しました。私は変わった:

ImageBindingSource.DataSource = this.item.Image.ImageData;

に:

ImageBindingSource.DataSource = this.item.Image;

PictureBox は ImageData フィールドにバインドされていますが、DataSource は Image オブジェクトです。

現在、(少なくとも私にとっては) 進行状況を示すものではなく、小さな十字アイコンが表示されますが、byte[]-bitmap 変換コードが必要な場所がわかりません。

4

2 に答える 2

5

レポートの画像ボックスSourceプロパティを にDatabase設定することで、これを解決できました(以前は に設定されていましたExternal)。

使用可能なさまざまな Source 値の詳細については、(MSDN) HowTo: Add an Image (Reporting Services) を参照してください。

于 2012-09-10T06:27:38.413 に答える
1

バイト配列から画像オブジェクトを作成し、それをソースとして使用する必要があります。

これを行うには、次のようなヘルパー関数を使用できます

public static Image LoadImage(byte[] imageBytes)
{
     Image image = null;
     using (var ms = new MemoryStream(imageBytes))
         image = Image.FromStream(ms);

     return image;
}

編集

WPF の場合、( MSDN ) の代わりに ( MSDN )BitmapSource使用する必要がありますImage

public static BitmapSource LoadImage(Byte[] imageBytes)
{
    var image = new BitmapImage();
    using (var ms = new MemoryStream(binaryData))
    {
        image.BeginInit();
        image.StreamSource = ms;
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.EndInit();
    }

    if (image.CanFreeze)
        image.Freeze();

    return image;
}

注:を使用してこれを行うこともできます。ソース コードについては、IValueConverterこのブログ投稿を参照してください。


次に、データバインディングを変更します

ImageBindingSource.DataSource = LoadImage(item.Image.ImageData);

...

イメージ (およびMemoryStream) が終了したら、適切に破棄されていることを確認してください。そうしないと、メモリ リークが発生します。

また、バイト配列の形式によっては、何らかの作業が必要になる場合があります。役立つ情報については、私の質問/回答の 1 つを参照してください。

于 2012-09-07T13:36:11.673 に答える