0

VS 2008 で .net 2 用に作成され、VS 2010 にアップグレードされ、.net 4 用にビルドされたアプリがあります。このアプリには Crystal Report があります。レポートによるデータベースとの対話は絶対に行わないでください。プロジェクト内のオブジェクトの 1 つからさまざまな ITextObject フィールドを手動で設定しました。

例:

            to = (CrystalDecisions.CrystalReports.Engine.TextObject)crystalPrint.Section2.ReportObjects["tbName"];
            to.Text = visitor.first + " " + visitor.last;

            to = (CrystalDecisions.CrystalReports.Engine.TextObject)crystalPrint.Section2.ReportObjects["tbCompany"];
            to.Text = visitor.company;

visitorデータを取得しているクラスはどこですか。

繰り返しますが、このレポートでデータベースとのやり取りは絶対に行わないでください。

関連するスタック トレースは次のとおりです。 CrystalDecisions.ReportAppServer.DataSetConversion

編集:電話すると爆発しています.PrintToPrinter(1, false, 1, 0);

*編集/更新* app.configファイルを調べたところ、この小さなブロックが見つかりました

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

アプリでそれを使用すると、レポートが印刷されます。それをコメントアウトすると、爆発します.....

編集3:

その他のソース コード:

 cryBadge crystalPrint = new cryBadge();
 crystalPrint.ReportOptions.EnableSaveDataWithReport = false;

 //NOTE: pi is an internal object used to find printer information.
 crystalPrint.PrintOptions.PrinterName = pi.PrinterName;
 numSize = pi.FindPaperSizeIndex(height, wid);
 to = (CrystalDecisions.CrystalReports.Engine.TextObject)crystalPrint.Section2.ReportObjects["tbName"];
            to.Text = visitor.first + " " + visitor.last;

 to = (CrystalDecisions.CrystalReports.Engine.TextObject)crystalPrint.Section2.ReportObjects["tbCompany"];
 to.Text = visitor.company;
 crystalPrint.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Landscape;
 crystalPrint.PrintToPrinter(1, false, 1, 0);
4

2 に答える 2

0

たとえば、Crystal Reportsを使用してレポートを印刷する場合は、次のようにします。

あなたの例に基づいて

.PrintToPrinter(1, false, 1, 0);

ここでコードをリファクタリングしてみてください。

ReportDocument rd = new ReportDocument();
// Insert code to run the report here

// This gets the user's default printer to print to.
PrintDialog prt = new PrintDialog();
rd.PrintOptions.PrinterName = prt.PrinterSettings.PrinterName; 
// This does the printing.
rd.PrintToPrinter(copies, true, 1, 1000); 

以下でも試すことができる実用的な例。

//Note untested
PrintDialog pDialog = new PrintDialog();

Nullable<Boolean> print = pDialog.ShowDialog();
if (print == true)
{
    string value1 = "This is a Test";
    string value2= "Happy Halloween";
    ReportDocument rd = new ReportDocument();
    rd.Load("ReportFile.rpt");
    rd.SetParameter("Parameter1", value1);
    rd.SetParameter("Parameter2", value2);
    rd.PrintOptions.PrinterName = pd.PrinterSettings.PrinterName;
    rd.PrintToPrinter(1, false,0,0);
}
于 2012-10-31T21:29:34.890 に答える
0

大丈夫。理解した。

このコード ブロックを app.config ファイルに入力する必要がありました。

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

次に、構成ファイルが .exe にあることを確認します。たとえば、アプリが「TestApp1」と呼ばれる場合、出力フォルダーに TestApp1.exe.config ファイルがあるはずです。その .config ファイルは、アプリケーションにとどまる必要があります。

于 2012-10-31T22:11:23.200 に答える