找回密码
 立即注册

QQ登录

只需一步,快速开始

dlerror
中级会员   /  发表于:2014-1-20 08:22  /   查看:9190  /  回复:9
单元格输入数字后,在js中循环计算,结果在其他单元格中表示,现在发现计算过程中,IE处于假死状态,时间也过长,需要10多秒,请问有没有更省时间的方法或者让IE不假死的方法,谢谢。

9 个回复

倒序浏览
dlerror
中级会员   /  发表于:2014-1-20 08:34:00
沙发
JS方法如下:
        function spdService_DataChanged(e) {

            var cell;
            var WKROW;

            if (e.row > 0) {
                //订正时
                if ((Number(e.row) - 11) % 10 == 0) {
                    WKROW = e.row;
                    fncZaiKoSum(e.spread, WKROW);
                    //更新FLG
                    cell = e.spread.GetCellByRowCol(Number(WKROW) + 2 - 3, 50);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(Number(WKROW) + 2 - 3, 50, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();

                    //更新FLG set
                    cell = e.spread.GetCellByRowCol(e.spread.RowCount - 1, e.col);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(e.spread.RowCount - 1, e.col, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();
                }

                //生产数量1
                if ((Number(e.row) - 6) % 10 == 0) {
                    WKROW = Number(e.row) + 5;
                    fncZaiKoSum(e.spread, WKROW);
                    //更新FLG
                    cell = e.spread.GetCellByRowCol(Number(WKROW) + 2 - 3, 50);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(Number(WKROW) + 2 - 3, 50, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();

                    //更新FLG set
                    cell = e.spread.GetCellByRowCol(e.spread.RowCount - 1, e.col);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(e.spread.RowCount - 1, e.col, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();
                }

                //生产数量2
                if ((Number(e.row) - 7) % 10 == 0) {
                    WKROW = Number(e.row) + 4;
                    fncZaiKoSum(e.spread, WKROW);
                    //更新FLG
                    cell = e.spread.GetCellByRowCol(Number(WKROW) + 2 - 3, 50);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(Number(WKROW) + 2 - 3, 50, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();

                    //更新FLG set
                    cell = e.spread.GetCellByRowCol(e.spread.RowCount - 1, e.col);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(e.spread.RowCount - 1, e.col, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();
                }

                //取得数量1
                if ((Number(e.row) - 3) % 10 == 0) {
                    WKROW = Number(e.row) + 8;
                    fncZaiKoSum(e.spread, WKROW);
                    //更新FLG
                    cell = e.spread.GetCellByRowCol(Number(WKROW) + 2 - 3, 50);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(Number(WKROW) + 2 - 3, 50, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();

                    //更新FLG set
                    cell = e.spread.GetCellByRowCol(e.spread.RowCount - 1, e.col);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(e.spread.RowCount - 1, e.col, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();
                }

                //取得数量2
                if ((Number(e.row) - 4) % 10 == 0) {
                    WKROW = e.row + 7;
                    fncZaiKoSum(Number(e.spread), WKROW);
                    //更新FLG
                    cell = e.spread.GetCellByRowCol(Number(WKROW) + 2 - 3, 50);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(Number(WKROW) + 2 - 3, 50, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();

                    //更新FLG set
                    cell = e.spread.GetCellByRowCol(e.spread.RowCount - 1, e.col);
                    cell.removeAttribute("FpCellType");
                    e.spread.SetValue(e.spread.RowCount - 1, e.col, "99999", true);
                    cell.setAttribute("FpCellType", "readonly");
                    e.spread.UpdatePostbackData();
                }

            }
            
        }
        
        function fncZaiKoSum(spd, intRow) {
            var SEISANSU1 = 0;
            var SEISANSU2 = 0;
            var HATSU1 = 0;
            var HATSU2 = 0;
            var HATSUTOTAL = 0;
            var HIRUZAIKO = 0;
            var YORUZAIKO = 0;
            var TEISEISU = 0;
            var ZAIKOINDX = 0;
            var SYUKOSU = 0;

            var cell;
            var Zenzan = Number(spd.GetValue(intRow, 1));
            var INDX = Number(intRow) + 2;

            for (var iCol = 3; iCol < 49; iCol++) {

                if (spd.GetValue(Number(INDX) - 2, iCol) == "") {
                    TEISEISU = 0;
                }
                else {
                    TEISEISU = Number(spd.GetValue(Number(INDX) - 2, iCol));
                }
               
                if (spd.GetValue(Number(INDX) - 7, iCol) == "") {
                    SEISANSU1 = 0;
                }
                else {
                    SEISANSU1 = Number(spd.GetValue(Number(INDX) - 7, iCol));
                }

                if (spd.GetValue(Number(INDX) - 6, iCol) == "") {
                    SEISANSU2 = 0;
                }
                else {
                    SEISANSU2 = Number(spd.GetValue(Number(INDX) - 6, iCol));
                }

                if (spd.GetValue(Number(INDX) - 10, iCol) == "") {
                    HATSU1 = 0;
                }
                else {
                    HATSU1 = Number(spd.GetValue(Number(INDX) - 10, iCol));
                }

                if (spd.GetValue(Number(INDX) - 9, iCol) == "") {
                    HATSU2 = 0;
                }
                else {
                    HATSU2 = Number(spd.GetValue(Number(INDX) - 9, iCol));
                }

                //if (spd.GetValue(Number(INDX) - 6, iCol) == "") {
                //    SYUKOSU = 0;
                //}
                //else {
                //    SYUKOSU = Number(spd.GetValue(Number(INDX) - 6, iCol));
                //}

                //确定数合计
                HATSUTOTAL = HATSU1 + HATSU2;
                cell = spd.GetCellByRowCol(Number(INDX) - 8, iCol);
                cell.removeAttribute("FpCellType");
                if (HATSUTOTAL == 0) {
                    spd.SetValue(Number(INDX) - 8, iCol, "", true);
                }
                else {
                    spd.SetValue(Number(INDX) - 8, iCol, HATSUTOTAL, true);
                }
                cell.setAttribute("FpCellType", "readonly");
                spd.UpdatePostbackData();

                //昼在库数量
                HIRUZAIKO = Zenzan - HATSU1 + TEISEISU;
                cell = spd.GetCellByRowCol(Number(INDX) - 4, iCol);
                cell.removeAttribute("FpCellType");
                if (HIRUZAIKO == 0) {
                    spd.SetValue(Number(INDX) - 4, iCol, "", true);
                }
                else {
                    spd.SetValue(Number(INDX) - 4, iCol, HIRUZAIKO, true);
                }
                if (HIRUZAIKO < 0) {
                    spd.Cells(Number(INDX) - 4, iCol).SetForeColor("#FF0000");
                }
                else {
                    spd.Cells(Number(INDX) - 4, iCol).SetForeColor("#000000");
                }
                cell.setAttribute("FpCellType", "readonly");
                spd.UpdatePostbackData();

                //夜在库数量
                YORUZAIKO = HIRUZAIKO - HATSU2 + SEISANSU1;
                cell = spd.GetCellByRowCol(Number(INDX) - 3, iCol);
                cell.removeAttribute("FpCellType");
                if (YORUZAIKO == 0) {
                    spd.SetValue(Number(INDX) - 3, iCol, "", true);
                }
                else {
                    spd.SetValue(Number(INDX) - 3, iCol, YORUZAIKO, true);
                }
                if (YORUZAIKO < 0) {
                    spd.Cells(Number(INDX) - 3, iCol).SetForeColor("#FF0000");
                }
                else {
                    spd.Cells(Number(INDX) - 3, iCol).SetForeColor("#000000");
                }
                cell.setAttribute("FpCellType", "readonly");
                spd.UpdatePostbackData();

                Zenzan = YORUZAIKO + SEISANSU2;
                                
            }
            
        }
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-1-20 10:10:00
板凳
回复 2楼dlerror的帖子

谢谢您提供详细的信息。

Spread版本是那个?  您目前的数据量多少?

能给个简易demo吗? 这样定位快速一些。
回复 使用道具 举报
dlerror
中级会员   /  发表于:2014-1-20 10:42:00
地板
回复 3楼roger.wang的帖子

版本是:SPREAD for ASP.NET 7.0
目前数据量是60行左右,51列。
输入数字后,遍历46列,从每列的5个单元格中取数进行计算,计算结果保存在该列的3个单元格中,保存的单元格都是只读的,每次保存时先解锁,保存后再锁定。
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-1-20 14:48:00
5#
回复 4楼dlerror的帖子

照理说,通过前台JS进行计算,赋值这2件事情,60行数据、50列不费时间的。

不ReadOnly测试过吗?
回复 使用道具 举报
dlerror
中级会员   /  发表于:2014-1-20 17:43:00
6#
回复 5楼roger.wang的帖子

不ReadOnly刚刚试了一下,和以前一样,没有效果。
回复 使用道具 举报
dlerror
中级会员   /  发表于:2014-1-21 09:45:00
7#
回复 5楼roger.wang的帖子

现在想把计算过程放到服务器端处理,单元格输入后,怎样能提交到服务器端?
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-1-21 09:52:00
8#
回复 7楼dlerror的帖子

前端挂接一个JS事件:ActiveCellChanged,当单元格输入后,换到下一个单元格,触发。
在事件内调用Update。


  1. <SCRIPT language=javascript>
  2.    function onUpdateButtonClick() {
  3.        FpSpread1.Update();    // updated to server
  4.    }
  5. </SCRIPT>

  6. 引用文档:Spread for ASP.NET 7.0 Product Documentation > Client-Side Scripting Reference > Scripting Members > Events > onActiveCellChanged
复制代码
回复 使用道具 举报
dlerror
中级会员   /  发表于:2014-1-22 17:41:00
9#
回复 8楼roger.wang的帖子

问题解决了,原因是客户测试的数据量太大,一共1800条,全部在页面中显示,任何对Spread的操作都非常的缓慢。
现在使用了虚拟翻页,每次只显示30行,输入后的计算由JS改为服务器端执行,每次操作基本在1分钟之内,基本达到客户需要。
感谢版主提供的帮助。
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-1-23 09:16:00
10#
回复 9楼dlerror的帖子

:g~ij:   解决了就好, 您分享的这个处理办法会给更多的GCDN用户受益的, 再次谢谢!

欢迎有问题再开新帖沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部