web-dev-qa-db-ja.com

実行時にCrystalReportの画像を動的に変更する

VisualStudio2005に含まれているCrystalReportsを使用しています。理想的には、実行時にレポートに表示される画像を変更するには、画像ファイルへのパスを作成してから、その画像をレポートに表示します。

このバージョンのCrystalReportsでこれを達成できた人はいますか?

13
Keith

仕事では、画像をデータテーブルのフィールドとしてレポートにプッシュすることでこれを行います。それはきれいではありませんが、それは仕事を成し遂げます。もちろん、このソリューションでは、DataSetを介してデータをレポートにプッシュする必要があります。私はいつもこれがせいぜいハックだと感じていました。画像パラメータがCRで可能であったことを本当に望んでいます。

編集: Crystalレポートをプレーンな古いオブジェクトにバインドしている場合は、レポートのbyte []プロパティを公開してそれを画像として処理する必要があることに注意してください。

7
Josh Bush

Joshがここに投稿したbyte[]のヒントを使用して、ようやく解決策に到達しました。

このソリューションは、プレーンな古いC#オブジェクトを使用してCrystal Reportsにデータを入力する場合に適用されます( http://www.aspfree.com/c/a/C-Sharp/Crystal-Reports-for-Visual-Studioを参照) -2005-in-CSharp / このアプローチの詳細については)。

C#クラスに、次のコードを挿入します。

private static byte[] m_Bitmap = null;

public byte[] Bitmap
{
   get
   {
      FileStream fs = new FileStream(bitmapPath, FileMode.Open);
      BinaryReader br = new BinaryReader(fs);
      int length = (int)br.BaseStream.Length;
      m_Bitmap = new byte[length];
      m_Bitmap = br.ReadBytes(length);
      br.Close();
      fs.Close();
      return m_Bitmap;
   }
}

次に、[データベースの確認]オプションを使用して、CRのC#オブジェクトマッピングを更新します。次に、BitmapプロパティがCRフィールドとして表示されます。フォームにドラッグするだけです。タイプはIBlobFieldObjectになります。実行すると、画像が表示されます。

2
e-holder

私もこの質問をしました(そしてあなたの質問に投票しました)!

[それ以来、C#オブジェクトプロパティを介してバイト配列を使用する解決策を見つけました。別の回答を参照してください。この答えを参考のためにここに残します...]

これが私が提案したものです(しかし、C#-2005とC#-2008の両方で試して失敗しました)。

  1. ディレクトリを選択し、そこにBMPを配置します(例: "C:\ Temp\image.bmp")。
  2. CR-Designerからa)右クリック->挿入-> OLEオブジェクト... b)[ファイルから作成]を選択しますc)[リンク]チェックボックスをオンにしますd)手順1で定義したbmpを参照して選択しますe)をクリックしますOK f)画像をフォームに配置します。
  3. C#コードで実行時にイメージを上書き/更新します。理論的には、Linkを画像ファイルに挿入したため、フォームが更新されると更新されます。

私はこのアプローチで運がなかった。フォームを最初にデザインしたときに画像が表示されます(ステップ2)。しかし、実行時に、イメージは更新されません。この時点から、物事は本当に奇妙になります。 CRは、消えないある種の画像をキャッシュしているようです。 CR-DesignerでOLEオブジェクトリンクを削除できますが、再作成すると、画像のサイズを変更しても、常に元の画像と同じサイズのブラックボックスが表示されます。 bmp)。

2
e-holder

Visual Studio2015で使用しているCrystalReportsの現在のバージョン(Visual Studio 2012以降用)は、この機能をサポートしています。次の手順に従います。

  1. レポートに画像を挿入します。これはプレースホルダーとして機能します。
  2. 画像を右クリックして、[オブジェクトのフォーマット]を選択します Right Click Image
  3. [画像]タブを選択し、数式ボタンを押します Picture Tab
  4. 数式ウィンドウが開きます。あなたの写真をリンクとして見つける式を入力してください。

    if({@ isDonor} = "1")then " http://www.ny.org/images/aaf/picture1.jpg " else " http:// www。 ny.org/images/aaf/picture2.jpg " Formula Editor これで完了です。

1
Glenn Gordon

条件式を使用して、画像の場所を設定することもできます。 Crystal Reports:Dynamic Images を参照してください。

1
craig

私が便利だと思ったもう1つのオプションは、使用したい写真を挿入することです。それに応じてグラフィックを配置し、グラフィックを右クリックして、[グラフィックのフォーマット]> [共通]に移動します。 [抑制]チェックボックスをオンにして、x-2と表示されている数式ボタンをクリックします。数式ウィンドウが表示されたら、グラフィックを非表示にするかどうかを決定するためのコードを追加するだけです。

私の場合、複数のエンティティに対して1つの請求書テンプレートを作成していました。数式ウィンドウで、COMPANY <> 1100と書いただけです。つまり、1100以外の会社の請求書が実行されるたびに、1100のグラフィックが抑制されます。

うまくいけば、これは人生を楽にする...

1
Adam

画像のパスを含むパラメータとこのページのチュートリアルを組み合わせて使用​​してみてください: http://www.idautomation.com/crystal/streaming_crystal.html

次に、手順8で、ハードコードされたパスの代わりにパラメーターを使用します。

1
Mikey

Joshが言ったように..データセットを使用して画像をプッシュする必要があります。または、イメージをデータベーステーブルに一度入れて、サブレポートを使用して何度もプルします。

0
dotjoe