如何在jqgrid中编辑时计算列值

时间:2011-09-06 20:24:30

标签: asp.net asp.net-mvc-2 jqgrid

我有一个常见的问题需要解决(使用我熟悉的其他网格控件很容易完成)。 在jqgrid,我很难过。 我有一个启用了内联编辑的jqgrid。我想添加一些脚本,以便在编辑行(或添加新行)时,ColumnC的值自动计算为ColumnA * ColumnB作为默认值。用户可以随时更改任何列中的值。我想要在用户输入该值时立即计算该值,而不是等到数据保存完毕。

到目前为止我的方法是将“更改”类型的dataEvent附加到ColumnA和ColumnB -

dataEvents: [
              { type: 'change', fn: function(e) {
                   var rowid = $("#myGrid").jqGrid('getGridParam','selrow');
                   var rowData = $("#myGrid").getRowData(rowid); 
                   var cell1 = rowData['ColumnA'];
                   var cell2 = rowData['ColumnB'];
                   var newValue = cell1 * cell2;
                   $("#myGrid").jqGrid('setCell', rowid, 'ColumnC', newValue);
                   } 
               },
          ]

显然,cell1& cell2实际上并不返回值,而是返回其他用户已在How to get a jqGrid cell value发现的整个单元格内容。获取单元格值的唯一方法似乎是使用剥离该值的自定义正则表达式用户函数。 除此之外,是否有更好/替代的方式来实现我的需求?像jqGrid - How to calculated column to jqgrid?这样简单但显然不会为我剪切,因为它只会显示数据而用户无法更新数据。

任何帮助都将不胜感激。

更新:在Oleg的指导下,我能够扩展getTextFromCell以支持我的需求。

            function getTextFromCell(cellNode) {
            var cellValue;
            //check for all INPUT types
            if (cellNode.childNodes[0].nodeName == "INPUT") {              
                //special case for handling checkbox
                if (cellNode.childNodes[0].type == "checkbox") {            
                    cellValue = cellNode.childNodes[0].checked.toString();  
                }
                else {
                    //catch-all for all other inputs - text/integer/amount etc
                    cellValue = cellNode.childNodes[0].value;               
                }
            }
            //check for dropdown list
            else if (cellNode.childNodes[0].nodeName == "SELECT") {         
                var newCell = $("select option:selected", cellNode);
                cellValue = newCell[0].value;
            }
            return cellValue;             
        }

        function getCellNodeFromRow(grid,rowId,cellName) {
            var i = getColumnIndexByName(grid, cellName);
            var cellValue;
            //find the row first
           $("tbody > tr.jqgrow", grid[0]).each(function() {
                //The "Id" column in my grid is at index 2...
                var idcell = $("td:nth-child(2)", this); 
                var currRowId = getTextFromCell(idcell[0])
                if (currRowId == rowId) {
                    cellValue = getTextFromCell($("td:nth-child(" + (i + 1) + ")", this)[0]);
                    return false;
                }
            });
            return cellValue;
        }

getCellNodeFromRow中的代码效率最高。有一个.each()循环用于查找匹配的行节点。当网格有数千行时,我可以看到这种情况很慢。是否有更好/更有效的方法来查找行节点?我已经有了行ID。

2 个答案:

答案 0 :(得分:1)

the demo查看the answer。它使用单元格编辑,但同样的技术也适用于内联编辑。只需单击“金额”列中的任何单元格,然后修改数值。您将看到在单元格仍处于编辑模式期间,“总计”行(页脚)中的值将动态更改。我认为这就是你所需要的。

答案 1 :(得分:0)

    you can achieve this using onCellSelect event of jqgrid as below



//global section
var columnA;
var ColumnB;
var ColumnC;
var currentRow;

//

onCellSelect: function (rowid, iCol, aData) {

                currentRow = rowid;
                var ColumnA = $('#grid').getCell(rowid, 'MyCol');
                var ColumnB = $('#grid').getCell(rowid, 'MyCol');

                 $("#grid").jqGrid('editRow', rowid, true );
                $("#myMenu").hide();
                if (rowid && rowid !== lastsel) {
                    if (lastsel) jQuery('#grid').jqGrid('restoreRow', lastsel);
$("#grid").jqGrid('editRow', rowid, true );
                    lastsel = rowid;
                }
                else if (rowid && rowid === lastsel)
                { $("#grid").jqGrid('editRow', rowid, true ); }

               //if it is in editable mode 
               // when you view the html using firebug it will be like the cell id change to                       
               //format like "rowid_ColumnName"
               $('#' + currentRow + '_ColumnC').val(ColumnA*ColumnB);

               // or you can use achieve this using following jqgrid method at 
               //appropriate  place
               $("#myGrid").jqGrid('setCell', rowid, 'ColumnC', ColumnA*ColumnB);



}