找回密码
 立即注册

QQ登录

只需一步,快速开始

dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-4-27 11:50:57
11#
您好,经确认,spread 不支持childview的公式,只能像上面的方式自己计算total赋值给parent,然后继续向上递归。
回复 使用道具 举报
stufot
金牌服务用户   /  发表于:2016-4-27 13:44:39
12#
dexteryao 发表于 2016-4-27 11:11
您好,第一个问题原因还在调查,现有的解决方案是前端调用update

第二点的还没有好的解决方案,有一个办 ...

感谢回复。关于第二点父级更新的问题还有一个疑问。

比如我更新第三级的数据,第二级的数据能自动计算更新。但是第一级的数据,不能自动计算更新。只有再次一下第二级的单元格,第一级才能更新。

是否可以在更新第三级的时候,第一级和第二级一样,也自动更新呢?
spread表格多层级数据联动-V3.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-4-27 14:07:28
13#
这就是我说的需要递归实现。
对上面做两处改动,
1 用DataChanged事件
  1. <script lang="javascript" type="text/javascript">
  2.         window.onload = function () {
  3.             var spread1 = document.getElementById("<%=FpSpread1.ClientID %>");
  4.             if (document.all) {
  5.                 // IE
  6.                 if (spread1.addEventListener) {
  7.                     // IE9
  8.                     spread1.addEventListener("DataChanged", cellChanged, false);
  9.                 } else {
  10.                     // Other versions of IE and IE9 quirks mode (no doctype set)
  11.                     spread1.onActiveCellChanged = cellChanged;
  12.                 }
  13.             }
  14.             else {
  15.                 // Firefox
  16.                 spread1.addEventListener("DataChanged", cellChanged, false);
  17.             }

  18.             function cellChanged(event) {
  19.                spread1.Update();
  20.             }
  21.         }
  22.    
  23. </script>
复制代码

2. 递归计算total
  1.         private void FpSpread1_ChildViewCreated(object sender, CreateChildViewEventArgs e)
  2.         {

  3.             e.SheetView.ColumnHeader.Visible = false;
  4.             e.SheetView.Columns[0].Width = 48;
  5.             if (e.SheetView.RelationName == "Second")
  6.             {
  7.                 e.SheetView.Columns[0].Width = 6;
  8.             }

  9.             for (int i = 0; i < e.SheetView.RowCount; i++)
  10.             {
  11.                 e.SheetView.Cells[i, 4].Formula = "D" + (i + 1).ToString() + "*10";
  12.             }
  13.             e.SheetView.AutoCalculation = true;
  14.             ReCalc(e.SheetView);
  15.         }

  16.         private void ReCalc(SheetView sheetview)
  17.         {
  18.             if (sheetview == null || sheetview.Parent == null)
  19.             {
  20.                 return;
  21.             }

  22.             int total = 0;
  23.             for (int i = 0; i < sheetview.RowCount; i++)
  24.             {
  25.                 total += (int)sheetview.Cells[i, 3].Value;
  26.             }
  27.             sheetview.Parent.Cells[sheetview.ParentRowIndex, 3].Value = total;

  28.             ReCalc(sheetview.Parent);
  29.         }
复制代码
回复 使用道具 举报
stufot
金牌服务用户   /  发表于:2016-4-27 15:30:40
14#
dexteryao 发表于 2016-4-27 14:07
这就是我说的需要递归实现。
对上面做两处改动,
1 用DataChanged事件

第二点,修改第三级的数据时
第一级的数据不能取到当前的修改值的汇总,总是上一次修改值的汇总。

如附件三个图片:

图1:为第一次加载的数据
图2:修改第三级的数据,第二级数据自动汇总更新,第一级数据没变。
图3:修改第三级的数据,第二级数据自动汇总更新,第一级数据也有变化,但是第一级数据是使用第一次修改的后的数据更新,不是使用本次修改后数据更新的。

请问这个bug能解决吗?

加载的默认值

加载的默认值

第一次修改第三级数据

第一次修改第三级数据

第二次修改第三级数据

第二次修改第三级数据
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-4-27 15:58:16
15#
得做两次更新才可以
            function cellChanged(event) {
                spread1.Update();
                spread1.Update();
            }
同时改下这里吧,提高点性能

            if (e.SheetView.RelationName == "Second")
            {
                ReCalc(e.SheetView);
            }
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部