0

我有一个用 VS 2008 为 .net 2 编写的应用程序,升级到 VS 2010 并为 .net 4 构建。在这个应用程序中是一个 Crystal Report。报告应该绝对没有数据库交互。我从项目中的一个对象中手动设置了各种 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 回答