FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 39544|回复: 22
打印 上一主题 下一主题

【已解决】Grid底部合计行功能实现,绝对定位到表格底部!

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-20 08:10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<script type="text/javascript" language="javascript">
               var gridClientID = '<%= grid.ClientID %>';
           //浮点加法
           function accAdd(arg1, arg2) {
               var r1, r2, m;
               try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
               try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
               m = Math.pow(10, Math.max(r1, r2))
               return (arg1 * m + arg2 * m) / m
           }
           //合计函数Begin  
           function GridSum(grid) {
               var sum1 = 0;
               var sum2 = 0;
               var sum3 = 0;
               var sum4 = 0;
               var sum5 = 0;
               var sum6 = 0;
               //...有几个列需要合计就声明几个变量
               grid.store.each(function(record) {              //函数grid.store.each(record))相当于一个for循环,遍历整个record
                   sum1 = accAdd(record.data["test1"], sum1); //把test1列下面的所有值进行加和运算,注意点:test1是该列ColumnID属性 例:<ext:BoundField Width="70px" DataField="XXXXX" HeaderText="测试"  TextAlign="Center" ColumnID="test1" />
                   sum2 = accAdd(record.data["test2"], sum2); //把test2列下面的所有值进行加和运算
                   sum3 = accAdd(record.data["test3"], sum3);
                   sum4 = accAdd(record.data["test4"], sum4);
                   sum5 = accAdd(record.data["test5"], sum5);
                   sum6 = accAdd(record.data["test6"], sum6);
               });
               //sum1 = addComma(sum1);
               var p = new Ext.data.Record(
                 {
                     "OrderDateField": '合计',
                     "test1": sum1,  //把test1列与合计后得到的值对应起来
                     "test2": sum2,   //把test2列与合计后得到的值对应起来
                     "test3": sum3,
                     "test4": sum4,
                     "test5": sum5,
                     "test6": sum6
                 }
               );
               //grid.store.insert(0, p); // 插入到当前页的第一行
               grid.store.insert(grid.getStore().getCount(), p);  //插入到当前页的最后一行,函数 grid.getStore().getCount()用来获得当前页的记录行数
              //具体放哪一行 自己选择


               //改变改行颜色。。。。。。。。x-grid-cell-inner为CSS样式 大家自己写就行了
               var row = grid.getView().getRow(grid.getStore().getCount() - 1);
               Ext.get(row).first().addClass("x-grid-cell-inner");
           }
           //合计函数End


           // 页面第一个加载完毕后执行的函数
           function onReady() {
               var grid = X(gridClientID);
               grid.addListener('viewready', function() {
                GridSum(grid);
               });
           }

           // 页面AJAX回发后执行的函数
           function onAjaxReady() {
               var grid = X(gridClientID);
               GridSum(grid);

           }
       </script>


在分页时,或者绑定行有触发OnRowCommand时。都会触发onAjaxReady这个JS 大家自己做个变量来控制把 防止合计重复加上去了 具体问题具体解决!
推荐
发表于 2013-6-4 18:19:34 | 只看该作者
{:soso_e179:}
沙发
发表于 2013-3-18 00:52:44 | 只看该作者
防止合计重复加上去了 具体问题具体解决!
怎么实现?
板凳
发表于 2013-6-4 16:17:46 | 只看该作者
多谢,下个版本会增加几个示例,演示如果制作合计行。

-增加合计行示例grid/grid_summary.aspx(◇辉◆:)。
-增加服务器端合计行示例grid/grid_summary_serverside.aspx(◆◇提拉米苏℡)。






需要写部分JS和CSS代码:
  1. <script>

  2.         var gridClientID = '<%= Grid1.ClientID %>';

  3.         function calcGridSummary(grid) {
  4.             var donateTotal = 0, store = grid.getStore(), view = grid.getView(), storeCount = store.getCount();

  5.             // 防止重复添加了合计行
  6.             if (Ext.get(view.getRow(storeCount - 1)).hasClass('mygrid-row-summary')) {
  7.                 return;
  8.             }

  9.             // 遍历每一行数据,计算汇总数据
  10.             store.each(function (record) {
  11.                 // 注:donate是列的ColumnID属性
  12.                 donateTotal += parseInt(record.data["donate"]);
  13.             });
  14.             var donateAvg = donateTotal / storeCount;


  15.             store.add(new Ext.data.Record({
  16.                 'major': '合计:',
  17.                 'donate': donateTotal
  18.             }));

  19.             store.add(new Ext.data.Record({
  20.                 'major': '平均:',
  21.                 'donate': donateAvg
  22.             }));


  23.             // 为合计行添加自定义样式(隐藏序号列、复选框列,取消 hover 和 selected 效果)
  24.             Ext.get(view.getRow(storeCount)).addClass('mygrid-row-summary');
  25.             Ext.get(view.getRow(storeCount + 1)).addClass('mygrid-row-summary');

  26.         }

  27.         // 页面第一个加载完毕后执行的函数
  28.         function onReady() {
  29.             var grid = X(gridClientID);
  30.             grid.addListener('viewready', function () {
  31.                 calcGridSummary(grid);
  32.             });

  33.             // 防止选中合计行
  34.             grid.getSelectionModel().addListener('beforerowselect', function (sm, rowIndex, keepExisting, record) {
  35.                 if (Ext.get(grid.getView().getRow(rowIndex)).hasClass('mygrid-row-summary')) {
  36.                     return false;
  37.                 }
  38.                 return true;
  39.             });
  40.         }

  41.         // 页面AJAX回发后执行的函数
  42.         function onAjaxReady() {
  43.             var grid = X(gridClientID);
  44.             calcGridSummary(grid);
  45.         }
  46.     </script>
复制代码

本帖子中包含更多资源

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

x
地板
发表于 2013-6-4 17:03:53 | 只看该作者
能显示在分页条的那里,有本页合计和总合计,就完美了。
5#
发表于 2013-6-4 17:59:09 | 只看该作者
冬天 发表于 2013-6-4 17:03
能显示在分页条的那里,有本页合计和总合计,就完美了。


你想要这样的效果么:


这个也好办,晚上给例子

本帖子中包含更多资源

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

x
7#
发表于 2013-6-4 20:54:00 | 只看该作者
{:soso_e179:}
8#
发表于 2013-6-6 17:02:03 | 只看该作者
又增加了一个示例:-增加合计行绝对定位到分页条上方的示例grid/grid_summary_absolute.aspx。

这个效果可能是很多网友想要的,即使出现滚动条也能一眼看到合计行,不过实现需要一定的技巧。


  1. <script>

  2.         var gridClientID = '<%= Grid1.ClientID %>';
  3.         var gridSummaryID = '<%= hfGrid1Summary.ClientID %>';

  4.         function calcGridSummary(grid) {
  5.             var donateTotal = 0, store = grid.getStore(), view = grid.getView(), storeCount = store.getCount();

  6.             // 防止重复添加了合计行
  7.             if (Ext.get(view.getRow(storeCount - 1)).hasClass('mygrid-row-summary')) {
  8.                 return;
  9.             }

  10.             // 从隐藏字段获取全部数据的汇总
  11.             var summaryJSON = JSON.parse(Ext.getCmp(gridSummaryID).getValue());


  12.             store.add(new Ext.data.Record({
  13.                 'major': '全部合计:',
  14.                 'donate': summaryJSON['donateTotal'].toFixed(2),
  15.                 'fee': summaryJSON['feeTotal'].toFixed(2)
  16.             }));


  17.             // 为合计行添加自定义样式(隐藏序号列、复选框列,取消 hover 和 selected 效果)
  18.             var summaryNode = Ext.get(view.getRow(storeCount)).addClass('mygrid-row-summary');

  19.             // 找到合计行的外部容器节点
  20.             var viewportNode = summaryNode.parent('.x-grid3-viewport');
  21.             // 删除容器节点下直接子节点为 mygrid-row-summary 的节点
  22.             viewportNode.select('> .mygrid-row-summary').remove();

  23.             // 创建合计行的副本
  24.             var cloneSummaryNode = summaryNode.dom.cloneNode(true);
  25.             // 修改合计行的副本的样式,绝对定位,距离底部0px,显示副本(默认是占位隐藏 visibility: hidden;)
  26.             Ext.get(cloneSummaryNode).setStyle({
  27.                 position: 'absolute',
  28.                 bottom: 0,
  29.                 visibility: 'visible'
  30.             });

  31.             // 向容器节点添加合计行的副本
  32.             viewportNode.appendChild(cloneSummaryNode);
  33.        
  34.         }

  35.         // 页面第一个加载完毕后执行的函数
  36.         function onReady() {
  37.             var grid = X(gridClientID);
  38.             grid.addListener('viewready', function () {
  39.                 calcGridSummary(grid);
  40.             });

  41.             // 防止选中合计行
  42.             grid.getSelectionModel().addListener('beforerowselect', function (sm, rowIndex, keepExisting, record) {
  43.                 if (Ext.get(grid.getView().getRow(rowIndex)).hasClass('mygrid-row-summary')) {
  44.                     return false;
  45.                 }
  46.                 return true;
  47.             });
  48.         }

  49.         // 页面AJAX回发后执行的函数
  50.         function onAjaxReady() {
  51.             var grid = X(gridClientID);
  52.             calcGridSummary(grid);
  53.         }
  54.     </script>
复制代码

本帖子中包含更多资源

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

x
10#
发表于 2013-6-6 18:49:35 | 只看该作者
官网上示例上没有吧?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-4-20 04:31 , Processed in 0.051276 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表