请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

vbagcl

初级会员

24

主题

100

帖子

210

积分

初级会员

积分
210

活字格认证微信认证勋章

[已处理] spread查询报错

vbagcl
初级会员   /  发表于:2017-4-22 11:01  /   查看:3885  /  回复:7
vs2012+c#开发,画面上使用线程,给SPREAD加载数据是线程触发的,给SPREAD加载数据的方式不是用datasource的方式,而是两层循环,按行按列赋值,也就是一个单元格一个单元格赋值的。SPREAD数据更新的频率是2分钟左右。每次更新是先将行设置成数据源的行: spread1.ActiveSheet.RowCount = RsRowCount;
因为对于一个画面,列是固定,所以每次刷新数据,列的值不变。
然后逐行,逐列根据列的类型进行赋值。
,程序刚开始运行时是没有错,运行很短一段时间就报错,如下截图: 报错截图.png
请高手指点,多谢!

7 个回复

倒序浏览
vbagcl
初级会员   /  发表于:2017-4-22 15:44:02
沙发
这种还有一个很奇怪的现象,如果单步调试不会出现,或者把画面处于非激活状态也不会报错。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-4-25 17:56:08
板凳
出现红叉是因为spread绘制是崩溃了,应该是您多线程造成的。建议您在主线程中操作spread

另外,您的帖子发到spread专区,那样方便即使处理。这个帖子我给您移动了
回复 使用道具 举报
vbagcl
初级会员   /  发表于:2017-5-10 09:07:10
地板
多谢!
由于账户密码忘记了,一直不能登录。
其实,我的代码很简单:
画面上有一个spread,名称:ss1.
画面上有一个button,button的click事件的代码如下:
private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "start")
            {
                Control.CheckForIllegalCrossThreadCalls = false;
                revThread = new System.Threading.Thread(writeSpread);
                revThread.Start();
                button1.Text ="end";
            }
            else
            {
                revThread.Abort();
                revThread = null;
                button1.Text = "start";
            }
        }

线程触发的函数程序如下所示:
private void writeSpread()
        {
            while (true)
            {
                rowCnt++;
                if (rowCnt > 8) rowCnt = 0;
                ss1.ActiveSheet.RowCount = rowCnt;
                ss1_Sheet1.ColumnCount = rowCnt;
                for (int i = 0; i < ss1.ActiveSheet.RowCount; i++)
                {
                    for (int j = 0; j < ss1_Sheet1.ColumnCount; j++)
                    {
                        ss1_Sheet1.Cells[i, j].Text = (i * j).ToString();
                    }
                }
                Thread.Sleep(4000);
              
               
            }
        }
如果使用Thread.Sleep(4000);只能画一次,第二次就报错。不加上Thread.Sleep(4000);一次也画不了。
但是如果写textbox就没有问题,代码如下:
private void writeSpread()
        {
            while (true)
            {
                rowCnt++;
                if (rowCnt > 80) rowCnt = 0;
                textBox1.Text = rowCnt.ToString();
                //ss1.ActiveSheet.RowCount = rowCnt;
                //ss1_Sheet1.ColumnCount = rowCnt;
                //for (int i = 0; i < ss1.ActiveSheet.RowCount; i++)
                //{
                //    for (int j = 0; j < ss1_Sheet1.ColumnCount; j++)
                //    {
                //        ss1_Sheet1.Cells[i, j].Text = (i * j).ToString();
                //    }
                //}
                //Thread.Sleep(4000);
              
               
            }
        }
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-5-11 10:08:16
5#
那这个就是我给您说得线程问题,spread的绘制需要在主线程里去完成。
回复 使用道具 举报
vbagcl
初级会员   /  发表于:2017-5-13 15:20:21
6#
我还是不明白,如何放在主线程里,代码怎么改呢?能把我的代码改一下下吗?
回复 使用道具 举报
vbagcl
初级会员   /  发表于:2017-5-14 11:21:15
7#
我改动一下代码,就是先将spread行设置0行,列设置成某个固定值,刷新spread的时候,只改动行,不改动列,不会报错,代码如下所示:
private void writeSpread()
        {      
                while (true)
                {
                    rowCnt++;
                    if (rowCnt > 80) rowCnt = 6;
                    //textBox1.Text = rowCnt.ToString();
                    ss1.ActiveSheet.RowCount = rowCnt;
                    //ss1_Sheet1.ColumnCount = 8;
                    for (int i = 0; i < ss1.ActiveSheet.RowCount; i++)
                    {
                        for (int j = 0; j < ss1_Sheet1.ColumnCount; j++)
                        {
                            ss1_Sheet1.Cells[i, j].Text = (i * j).ToString();
                        }
                    }
                    ss1_Sheet1.SetActiveCell(rowCnt - 1, 0);
                    ss1.ShowActiveCell(FarPoint.Win.Spread.VerticalPosition.Center, FarPoint.Win.Spread.HorizontalPosition.Center);
                    Thread.Sleep(500);
                }           
        }
表面上看,问题是解决了,但是还不明白为啥。这样感觉总是不安全。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-5-15 09:51:52
8#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部