2011-05-15 204 views
0

使用的jqGrid的setFooterData函数来计算像this question总量之后,这是我的网格和功能:的jqGrid取决于其他列单元格计算总列单元格量值

<script type="text/javascript"> 

    function calculateTotal(grid_ , column_id_) 
    { 
     var _total_amount = 0; 
     var i = getColumnIndexByName(grid_ , column_id_); 

     // TO ADD - calculate only if row "status" cell = "1:Confirmed" 
     $("tbody > tr.jqgrow > td:nth-child("+(i+1)+")" , grid_[0]).each(function() 
     { 
      _total_amount += Number(getTextFromCell(this)); 
     }); 

     return _total_amount; 
    } 

    function getColumnIndexByName(grid_ , column_id_) 
    { 
     var cm = grid_.jqGrid('getGridParam','colModel'); 
     for (var i=0,l=cm.length; i<l; i++) 
     { 
      if (cm[i].name===column_id_) 
      { 
       return i; // return the index 
      } 
     } 
     return -1; 
    } 

    function getTextFromCell(cellNode) 
    { 
     return cellNode.childNodes[0].nodeName === "INPUT"? 
        cellNode.childNodes[0].value: 
        cellNode.textContent || cellNode.innerText; 
    } 

    $(document).ready(function() { 

     var grid = $("#list"),lastSel; 

     grid.jqGrid({ 
      url:'url', 
      datatype: "xml", 
      loadonce:true , 
      async: false, 
      colNames: ['Inv No', 'Name' , 'Amount' , 'Status'], 
      colModel: [ 
       { name: 'id', index: 'id', width: 65, sorttype: 'int', hidden: true }, 
       { name: 'name', index: 'name', editable: true, width: 90, sortable: false }, 
       { name: 'amount', index: 'amount', editable: true, width: 70, formatter: 'number', align: 'right', sortable: false }, 
       {name:'status',index:'status', width:90, sorttype:"int" , editable:true, 
        edittype:"select", formatter:'select', 
        editoptions: 
        { 
        value:"1:Confirmed ;2:Open ; 3:Rejected" , 
        dataInit: function(elem) 
        { 
         $(elem).width(90); 
        } 
        } 
       }, 
      ], 
      rowNum: 1000, 
      pager: '#pager', 
      viewrecords: true, 
      sortorder: "desc",     
      height: "100%",     
      footerrow:true, 
      xmlReader: { 
              root:"rows", 
              row:"row", 
              repeatitems:false 
             }, 
      shrinkToFit: false, 
      beforeSelectRow: function(row_id_, e) 
      { 
      }, 
      onSelectRow: function(id) 
      { 
       grid.jqGrid('saveRow' , lastSel , false, 'clientArray'); 
       grid.editRow(id , false); 
       lastSel=id; 
      }, 
      loadComplete:function() 
      { 
       grid.jqGrid('footerData' , 'set' , {name:'TOTAL:' , amount: calculateTotal(grid , 'amount')}); 
      } 
     });    
    });  
</script> 

我的问题是如何计算总金额总和取决于iniside“状态”组合框中的值。只有当“状态”单元格中的值等于“确认”(= 1)时,我才想要总和该量。

这怎么办?

谢谢。

+0

我忘了提及你关于你的代码中的一些错误。你应该小心空白和换行。例如'value:“1:确认; 2:打开; 3:被拒绝的”'将被解释为树值为“1”,“2”和“3”(!!!),相应的数据为“确认”,“开放”和“拒绝”。而且在'colModel'定义的末尾加上“},]”尾随的逗号是语法错误。独立于你典型的代码格式风格,我建议你使用[Kernighan&Ritchie](http://en.wikipedia.org/wiki/Indent_style#K.26R_style)风格,因为可能的“;”插入JavaScript代码。 – Oleg 2011-05-16 15:21:01

回答

2

我制作了new demo我用另一种方法来枚举网格中的单元格(请参阅the answer)。

在我修改的getTextFromCellcalculateTotal函数的代码为以下演示:

var getTextFromCell = function(cellNode) { 
     if (cellNode.childNodes[0].nodeName.toUpperCase() === "SELECT") { 
      var selOptions = $("option:selected", cellNode); 
      if (selOptions.length>0) { 
       return selOptions.text(); 
      } 
     } 
     return cellNode.childNodes[0].nodeName.toUpperCase() === "INPUT"? 
       cellNode.childNodes[0].value: 
       cellNode.textContent || cellNode.innerText; 
    }, 
    calculateTotal = function() { 
     var totalAmount = 0, 
      iAmount=getColumnIndexByName(grid,'amount'), 
      iStatus=getColumnIndexByName(grid,'status'); 
     var i=0, rows = grid[0].rows, rowsCount = rows.length, row, status; 

     for(;i<rowsCount;i++) { 
      row = rows[i]; 
      if (row.className.indexOf('jqgrow') !== -1) { 
       status = getTextFromCell(row.cells[iStatus]); 
       if (status === "Confirmed") { 
        totalAmount += Number(getTextFromCell(row.cells[iAmount])); 
       } 
      } 
     } 

     grid.jqGrid('footerData','set',{name:'TOTAL Confirmed',amount:totalAmount}); 
    }; 

现在,在总线将被显示的所有值的总和从“金额”列,但是仅将考虑“状态”列中具有“已确认”的行。

+0

有没有办法获得值1而不是“已确认”? – user590586 2011-05-15 14:30:41

+0

@ user590586:不客气! – Oleg 2011-05-15 14:30:44

+0

@ user590586:我想你应该使用'selOptions.val()'而不是'selOptions.text()'。 – Oleg 2011-05-15 17:54:09

相关问题