找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-1-26 14:40:20
11#
抱歉,少拷贝了一句代码,CreateHandleInternal方法其实是Form1里面的创建了一个方法

  1.     public void CreateHandleInternal()
  2.     {
  3.       CreateHandle();
  4.     }
复制代码



附上修改后的程序,你可以直接下载运行看看

spread_win_richtextbox.zip

17.97 MB, 下载次数: 1106

回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2021-1-27 11:13:17
12#
本帖最后由 bingdaoice 于 2021-1-27 11:45 编辑
Richard.Ma 发表于 2021-1-26 14:40
抱歉,少拷贝了一句代码,CreateHandleInternal方法其实是Form1里面的创建了一个方法

感谢版主。你提供的DEMO可以运行。但是新的问题出现了。当线程正在运行时关闭FROM窗体,并结束程序。
再次运行时会出现“内存不足”或“System.ArgumentException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 的问题
导致程序无法继续运行。附件中有我出现问题的DEMO,你可以直接下载测试。 image.png84866332.png image.png618205871.png





spread_win_中断模式2.rar

14.8 MB, 下载次数: 1169

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-1-27 14:12:39
13#
请给出重现问题的详细操作步骤,我这里没有能重现问题

另外,我看到你修改了代码,目前是在循环打印,如果你的目的主要是打印的话那么并不需要创建Form3,直接创建spreaad对象来打印就行

  1.         private void OpenSpread(string JobName)
  2.         {
  3.            
  4.             FarPoint.Win.Spread.FpSpread fpSpread1=new FarPoint.Win.Spread.FpSpread();
  5.             fpSpread1.Open(AppDomain.CurrentDomain.BaseDirectory + "1.xml");

  6.             string PrinterName = "检定证书";
  7.             if (fpSpread1.GetPrintPageCount(1) > 2)
  8.                 PrinterName = PrinterName + "多页";

  9.             fpSpread1.Sheets[1].PrintInfo.ShowBorder = false;//是否要打印在整个控件周围的外框边界。
  10.             fpSpread1.Sheets[1].PrintInfo.ShowGrid = false;//该值指示是否打印网格线
  11.             fpSpread1.Sheets[1].PrintInfo.ShowRowHeaders = false;//获取或设置是否打印行头
  12.             fpSpread1.Sheets[1].PrintInfo.ShowColumnHeaders = false;//获取或设置是否打印列头
  13.             fpSpread1.Sheets[1].PrintInfo.Centering = FarPoint.Win.Spread.Centering.Horizontal;//该值指示打印输出时的居中显示方式
  14.             fpSpread1.Sheets[1].PrintInfo.ShowPrintDialog = false;//是否显示打印机选择窗口
  15.             fpSpread1.Sheets[1].PrintInfo.ShowColor = false;
  16.             fpSpread1.Sheets[1].PrintInfo.Preview = false;//是否预览
  17.             fpSpread1.Sheets[1].PrintInfo.JobName = JobName;
  18.             fpSpread1.PrintSheet(1, false);


  19.             

  20.         }
复制代码
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2021-1-27 14:33:01
14#
我的打印情况是这样的:
打印的数量不定,举例打印500份:当打印比较多的时候就需要有暂停打印、取消打印,所以才会把打印放到线程里面去执行。
每一份的文件内容是不一样的。每需每次加载不同的文件进行打印。
上面的问题重现的需要如下操作:
不改动代码:运行打印约20、30份时。直接关闭FORM窗体,结束程序。
然后再次运行,再次打印。应该会报出问题。
如果没有,当打印到70、80份的时候。直接关闭FORM窗体,结束程序。
然后再次运行,再次打印。反复如此操作,问题会出现。

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-1-27 15:18:50
15#
了解,按照我上面给你修改的代码,放在一个新线程执行就可以 ,不需要创建Form
建议只新建一个Spread对象,只循环PrintSheet,可通过一个bool属性isCancel,来判断终止循环以取消打印
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2021-1-28 09:24:00
16#
Richard.Ma 发表于 2021-1-27 15:18
了解,按照我上面给你修改的代码,放在一个新线程执行就可以 ,不需要创建Form
建议只新建一个Spread对象 ...

谢谢版主。现在出现新的打印问题。在打印加上暂停、取消后。再次启动打印会出现。

image.png474968871.png
附件可重现问题。
操作步骤是:开始打印-打印几份之后-取消打印--再开始打印。问题可重现。
或者开始打印-打印10份之后-暂停打印-再继续打印-问题会偶现。

spread_win_中断模式2.rar

14.81 MB, 下载次数: 1337

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-1-28 11:37:36
17#
“从不是创建控件的线程访问他”,这个错误和Spread没有关系,一般来说是另一个线程修改界面控件时提示,这个应该是你第一种情况发生的错误。两次点击开始,又重新创建了一个线程
如果你点击开始是为了重新开始另一次循环打印的话,那取消打印时就应该关掉之前的线程,

第二种情况我这边也测试出了另一个错误,这个是由于打开文件时文件被另一个Spread对象占用。因此我昨天回复你建议是在单独的一个Spread对象来循环打印

下面是我给你修改了OpenSpreadNew方法,循环放在里面执行,新建线程直接调用这个方法,开始打印和取消打印,你得再加逻辑来控制,不要多次点击开始创建多个线程
  1. public  void OpenSpreadNew()
  2.         {
  3.             string JobName = "";
  4.             FarPoint.Win.Spread.FpSpread fpSpread1 = new FarPoint.Win.Spread.FpSpread();
  5.             fpSpread1.Open(AppDomain.CurrentDomain.BaseDirectory + "1.xml");

  6.             string PrinterName = "检定证书";
  7.             if (fpSpread1.GetPrintPageCount(1) > 2)
  8.                 PrinterName = PrinterName + "多页";
  9.             fpSpread1.Sheets[1].PrintInfo.ShowBorder = false;//是否要打印在整个控件周围的外框边界。
  10.             fpSpread1.Sheets[1].PrintInfo.ShowGrid = false;//该值指示是否打印网格线
  11.             fpSpread1.Sheets[1].PrintInfo.ShowRowHeaders = false;//获取或设置是否打印行头
  12.             fpSpread1.Sheets[1].PrintInfo.ShowColumnHeaders = false;//获取或设置是否打印列头
  13.             fpSpread1.Sheets[1].PrintInfo.Centering = FarPoint.Win.Spread.Centering.Horizontal;//该值指示打印输出时的居中显示方式
  14.             fpSpread1.Sheets[1].PrintInfo.ShowPrintDialog = false;//是否显示打印机选择窗口
  15.             fpSpread1.Sheets[1].PrintInfo.ShowColor = false;
  16.             fpSpread1.Sheets[1].PrintInfo.Preview = false;//是否预览
  17.             fpSpread1.Sheets[1].PrintInfo.JobName = JobName;
  18.             fpSpread1.Sheets[1].PrintInfo.Printer = PrinterName;
  19.             
  20.             for (int i = 1; i <= 100; i++)
  21.             {
  22.                 while (Suspend == true)
  23.                 {
  24.                 }
  25.                 if (Stop == true)
  26.                     break;
  27.                 fpSpread1.PrintSheet(1, false);
  28.                
  29.                
  30.             }
  31.             
  32.         }
复制代码





spread_win_中断模式2.zip

17.99 MB, 下载次数: 1349

回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2021-1-28 15:34:36
18#
Richard.Ma 发表于 2021-1-28 11:37
“从不是创建控件的线程访问他”,这个错误和Spread没有关系,一般来说是另一个线程修改界面控件时提示,这 ...

我这个打印其实要实现的目的是批量打印:例如有100份文件(不一样的内容)依次打开、打印。只是论坛上传不能超过20M,所以没办法加多个文件。
所以DEMO里面用重复打开1个文件来模拟。
其实想要实现的目的我个人感觉真的很简单的要求。
就是打开文件、打印。当数量多的时候可以暂停、取消。暂停以后,可以继续打印。


附件中的DEMO。只要开始打印以后,不管暂停或取消。再次进行打印的时候都会出错。无法达到想打印就打印,想暂停就暂停。想取消就取消。
请版主帮我想想办法。达到想打印就打印,想暂停就暂停。想取消就取消。
再次感谢版主!

spread_win_中断模式2.rar

14.81 MB, 下载次数: 1387

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-1-28 16:36:47
19#
已经电话和你沟通,
在我原来代码的基础上,将加载文件也放在循环里面就行
也就是说
1.创建spread对象
2循环加载文件打印,类似如下代码
  1. foeach(string filename in filelist){

  2.     spread.load(filename )
复制代码
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2021-1-29 12:12:13
20#
Richard.Ma 发表于 2021-1-28 16:36
已经电话和你沟通,
在我原来代码的基础上,将加载文件也放在循环里面就行
也就是说

非常感谢版主!但是我不管使用当前进程打印。还是使用线程打印。4种模式进行测试打印都会报错。
我在DEMO里面都有标注。
请版主帮忙测试一种方法可以想打印就打印,想暂停就暂停。想取消就取消。
万分感谢!
image.png707332458.png

spread_win_中断模式2.rar

14.81 MB, 下载次数: 1404

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部