找回密码
 立即注册

QQ登录

只需一步,快速开始

Pirate

注册会员

2

主题

14

帖子

54

积分

注册会员

积分
54
最新发帖
Pirate
注册会员   /  发表于:2020-7-27 17:36  /   查看:3158  /  回复:9
1金币
如题所述,我们要实现的功能是用c#文本框编辑时,实时计算页数。我们想到的方法是捕捉文本框文字改变事件和回车事件,但是在调用c1report1代码时,出现未将对象引用设置到对象的实例的异常。
出错代码和异常如下图:

注意:红色部分是加载report的路径,与这次异常没有关系,所以打了码。
1.在捕捉文本框文字改变事件时,会出现以上异常。
2.在捕获回车事件时,多次回车后出现以上异常。

请问有什么办法可以解决这个c1report1报的异常,或者麻烦看看c1report1这部分代码出了啥问题或者内部逻辑是啥?
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

c1Report1.Render()是一个异步方法。问题的原因在于执行c1Report1.Render()方法时,c1Report1已经被占用了, 此时如果再去重复调用c1Report1.Render(),就会报错 解决的办法是设置一个bool标志比如下面代码中的isrendering[/backcolor] [/backcolor],通过EndReport事件判断是否已经完成渲染

9 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-27 17:36:17
来自 4#
本帖最后由 Richard.Ma 于 2020-7-28 12:23 编辑

c1Report1.Render()是一个异步方法。问题的原因在于执行c1Report1.Render()方法时,c1Report1已经被占用了,
此时如果再去重复调用c1Report1.Render(),就会报错

解决的办法是设置一个bool标志比如下面代码中的isrendering ,通过EndReport事件判断是否已经完成渲染

  1.         private void textBox1_TextChanged_1(object sender, EventArgs e)
  2.         {
  3.             string WYSText = textBox1.Text;
  4.             string WYGText = textBox1.Text;
  5.           DataTable ty = GetDataTable(WYSText, WYGText);
  6.           c1Report1.Load(@"C:\Carestream\RISGC\UserTemplates\ProductsReport2.xml", "report2"); // preview the document
  7.          this.c1Report1.DataSource.Recordset = ty;
  8.             if (!isrendering)
  9.             {
  10.                 //这里在渲染前将isrendering设置为true,防止重复调用
  11.                 isrendering = true;
  12.                 this.c1Report1.Render();
  13.                
  14.                 //Thread.Sleep(5000);
  15.                 int page = c1Report1.GetPageCount();
  16.                
  17.             }
  18.             label1.Text = WYSText.ToString();
  19.             //c1PrintPreviewControl1.Document = c1Report1.Document;



  20.         }
  21.         bool isrendering = false;
  22.         private void c1Report1_EndReport(object sender, EventArgs e)
  23.         {
  24.             isrendering = false;
  25.         }
复制代码


回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-27 18:10:59
2#
你好,请上传一个可以重现问题的demo,我来验证问题
回复 使用道具 举报
Pirate
注册会员   /  发表于:2020-7-28 09:05:50
3#
Richard.Ma 发表于 2020-7-27 18:10
你好,请上传一个可以重现问题的demo,我来验证问题

一个winform程序。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Pirate
注册会员   /  发表于:2020-7-28 10:36:19
5#
Richard.Ma 发表于 2020-7-27 18:10
你好,请上传一个可以重现问题的demo,我来验证问题

补充一个report模板。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-28 12:32:50
6#
好的,我刚才注释掉加载模板代码测试在3楼给你的这种方法可以,但是加上模板好像还是有一些问题
回复 使用道具 举报
Pirate
注册会员   /  发表于:2020-7-28 13:44:51
7#
Richard.Ma 发表于 2020-7-28 12:32
好的,我刚才注释掉加载模板代码测试在3楼给你的这种方法可以,但是加上模板好像还是有一些问题

我刚才试了下你的代码,确实还是有点问题,你的方法设置个标志,来区分是否渲染完是个不错的解决方向。如果把加载模板和赋值数据源,打印预览也放在if里,应该就可以吧
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-28 13:53:49
8#
是的,这样就不会有问题了,Load方法也会占用C1Report
回复 使用道具 举报
Pirate
注册会员   /  发表于:2020-8-19 15:14:43
9#
Richard.Ma 发表于 2020-7-28 13:53
是的,这样就不会有问题了,Load方法也会占用C1Report

你好,上次说的那个异常可以了,但是又出现另一个问题。同样的代码,同样的模板,但是只计算到3页,以后不管输入多少,每次getpagenum都只是3页,麻烦请看一下
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-8-19 17:33:15
10#
收到,我验证后给您回复
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部