dawnwind 发表于 2016-12-27 16:41:51

AR多线程中打印/预览账票

使用AR9.0 VS2015.
程序后台线程中直接调用一函数A(),
A中要自动打印一账票R1,再预览一账票R2,
现象1:执行到预览账票R2时,报错提示线程需要STA :"ShowWindow","呼び出しスレッドは、多数の UI コンポーネントが必要としているため、STA である必要があります。
现象2:将线程改为STA后,执行到预览账票R2时,报“object被另一个线程占用,呼出线程不能访问”错误。
现象3:若将函数A改为INVOKE到UI线程调用,在执行到打印账票R1 时,程序卡死到虚拟打印机保存对话框(鼠标可移动,但对话框上按钮点击无反应)。
跟踪到代码发现,以下出现问题时,If分支走一次,Else未执行:
Private Sub rptErrList_FetchData(ByVal sender As Object, ByVal eArgs As GrapeCity.ActiveReports.SectionReport.FetchEventArgs) Handles MyBase.FetchData
    If reder.Read = True Then
         xxxxx
      eArgs.EOF = False

    Else
      xxxxx

      eArgs.EOF = True
End Sub

请帮分析原因,提供解决思路,感谢。


dawnwind 发表于 2016-12-27 17:04:10

现象2错误提示

Lenka.Guo 发表于 2016-12-27 17:19:33

您的意思是,报表R1在后台打印中,加载报表R2???

dawnwind 发表于 2016-12-27 18:03:28

不是,R1先打印,打印完后,预览显示R2 (ShowDialog)

Lenka.Guo 发表于 2016-12-27 18:09:22

dawnwind 发表于 2016-12-27 18:03
不是,R1先打印,打印完后,预览显示R2 (ShowDialog)

打印的方法和报表显示的具体代码是什么?

我觉得看AR 提供Document.Print 方法,
public System.bool Print(
   System.bool showPrintDialog,
   System.bool showPrintProgressDialog,
   System.bool usePrintingThread
)
您把第三个参数修改下,看看效果

dawnwind 发表于 2016-12-27 19:08:09

Lenka.Guo 发表于 2016-12-27 18:09
打印的方法和报表显示的具体代码是什么?

我觉得看AR 提供Document.Print 方法,


感谢提供方法,使用Case3,并把Print第三个参数改为true后,R1卡死现象没出现了,但出现R2卡死现象,账票预览显示了,但点击账票上按钮无反应,无法关闭/打印张票。

dawnwind 发表于 2016-12-27 19:11:47

               打印账票的方法:
                var sectionDocument = objReport.Document;
                if (blnUsePrintThread)
                {
                  sectionDocument.Print(false, false, true);
                }
                else
                {
                  sectionDocument.Print(false, false, false);
                }
               预览显示方法:
                   WinReportViewer mainWindow = new WinReportViewer(objReport);
                  mainWindow.Title = strTitle;
                  mainWindow.ShowDialog();
                  mainWindow.Activate();
                  PrintFlg = mainWindow.PrintFlg;

dawnwind 发表于 2016-12-28 09:55:49

用STA线程方式,显示普通窗体是没问题的,窗体里加载账票就出现现象2提示

Lenka.Guo 发表于 2016-12-28 11:16:49

那您试着在预览代码后添加报表对象释放,是否能解决问题?,如果实在不行,您把能够重新问题的Demo上传下,我在这边调试并寻找解决方法


rpt.Document.Dispose();
rpt.Dispose();
rpt=null;


dawnwind 发表于 2016-12-28 12:31:06

demo是现象2的方式
页: [1] 2
查看完整版本: AR多线程中打印/预览账票