找回密码
 立即注册

QQ登录

只需一步,快速开始

xiwu

中级会员

97

主题

445

帖子

910

积分

中级会员

积分
910

活字格认证

xiwu
中级会员   /  发表于:2011-3-5 23:19  /   查看:10934  /  回复:13
SheetView sv = fpSpread1.Sheets["sheet1"];
            if (sv == null)
                return;
            int activeRows = sv.NonEmptyRowCount;        
                      if (activeRows > 2)
            {
               
                    sv.Cells[2, 9, activeRows - 1, 27].BackColor = Color.White;
                for (int i = 2; i < activeRows; i++)
                {
                    for (int j = 9; j < 26; j++)
                    {
                        if (sv.Cells[i, j].Formula == string.Empty)
                        {
                            sv.Cells[i, j].BackColor = Color.Red;
                        }
                    }
                }
            }
代码如上,程序执行至  sv.Cells[2, 9, activeRows - 1, 27].BackColor = Color.White;
时就变成“无响应”了,,0506帮我看下是什么问题

13 个回复

倒序浏览
gw0506
超级版主   /  发表于:2011-3-6 09:52:00
沙发
你只有这几行代码,我无法重现问题。
你可以debug一下,看看是不是activeRows太大了~
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-6 16:31:00
板凳
activeRows=85
回复 使用道具 举报
gw0506
超级版主   /  发表于:2011-3-6 16:45:00
地板
每设置一次backcolor,都会导致spread重绘,按你给的值,spread需要重绘将近1500次。所以会出现你说的情况。

你可以只设置可见区域的颜色。或者设置整个sheet的颜色再调整其他cell的颜色。总的来说,需要优化代码。
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-7 10:11:00
5#
sv.Cells[2, 9, activeRows - 1, 27].BackColor = Color.White; 调试发现,到这句就“死”了,根本没有下一句

60秒过后,提示错误:
CLR 无法从 COM 上下文 0x18d2b0 转换为 COM 上下文 0x18d140,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-7 10:56:00
6#
改成 ForeColor 也一样
回复 使用道具 举报
gw0506
超级版主   /  发表于:2011-3-7 11:57:00
7#
改成ForeColor,BackColor或者Font等等跟显示相关的设置,都一样会导致window重绘。这是肯定的,.NET机制决定的。

我的意思是,减少重绘次数。比如你有1500个cell要设置backcolor,总共有2000个cell,你现在是设置这1500个cell。其实你可以将sheet整个设置一次,然后在给那500个cell设置。这样可以减少1000次重绘。

再不行,你就把demo发给我。
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-7 14:20:00
8#
//公式检查:如果没有使用公式,改变背景色为红色,以示区别
        private void buttonItem45_Click_1(object sender, EventArgs e)
        {
            SheetView sv = fpSpread1.Sheets["洞身衬砌表"];
            if (sv == null)
                return;
            int activeRows = sv.NonEmptyRowCount;        
                      if (activeRows > 2)
            {
               
                //首先将所要检查的范围颜色设为白色
                sv.Cells[2, 11, activeRows - 1, 37].BackColor = Color.White;
                for (int i = 2; i < activeRows; i++)
                {
                    for (int j = 11; j < 20; j++)
                    {
                        if (sv.Cells[i, j].Formula == string.Empty)
                        {
                            sv.Cells[i, j].BackColor = Color.Red;
                        }
                    }
                }//*/
                           }
        }
其实我的程序在运行时需要修改颜色的单元格不超过10次,只有指定区域单元格没有公式的情况下才修改颜色,数据表还是上次上传过的那个数据表,
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-7 14:24:00
9#
回复 使用道具 举报
xiwu
中级会员   /  发表于:2011-3-7 14:26:00
10#
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部