2

私は CodeIgniter 2.1.0 で jqGrid を使用しています。私を悩ませているのは、特定のイベントの特定の列に値を割り当てる方法です

列の値に数量とレートを入力するとします...そして、「レート」フィールドからフォーカスを失うと、正味金額が計算され、金額フィールドに表示されます...

ここで行う必要があるのは、計算された値を金額フィールドに割り当てることです...しかし、どうすればいいのかわかりません??

私がやったことを以下に示します:

var selIRow = 1;
var rowid='';
var iCol='';
$("#purchasedetailsgrid").jqGrid({
    url: sitepath + 'purchase/purchase_grid',
    datatype: 'json',
    mtype: 'POST',
    height:220,
    width:500,
    colNames:["","","Store Name","Item Name","Inner Pkg.","Outer Pkg.","Qty","Rate","Amount"],
    colModel:[
        {name: 'storeID_hidden_field', index:'storeID_hidden_field',hidden: true, editable: true,edittype: 'text',editrules: {edithidden:true}},
        {name: 'itemID_hidden_field', index:'itemID_hidden_field',hidden: true, editable: true,edittype: 'text',editrules: {edithidden:true}},
        {name:'store_id', index:'store_id',width:150,search:false,editable:true,editrules:{number:false,maxlength:10}},
        {name:'item_id', index:'item_id',width:150,search:false,editable:true,editrules:{number:false,maxlength:10}},
        {name:'inner_pkg', index:'inner_pkg',width:150,search:false,editable:true,editrules:{number:true,maxlength:5}},
        {name:'outer_pkg', index:'outer_pkg',width:150,search:false,editable:true,editrules:{number:true,maxlength:5}},
        {name:'qty', index:'qty',editable:true,width:85,search:false,editrules:{number:true,maxlength:5}},
        {name:'rate', index:'rate',width:100,editable:true,search:false,editrules:{number:true,maxlength:10},
            editoptions: {
                dataInit: function (elem) { $(elem).focus(function () { this.select(); }) },
                dataEvents: [
                    {
                        type: 'keydown',
                        fn: function (e) {
                            var key = e.charCode || e.keyCode;
                            if (key == 9)//tab
                            {
                                $('#amount').val();//here in val() i need to write the value of qty and rate field
                            }
                        }
                    }
                ]
            }
        },
        {name:'amount', index:'amount',width:100,editable:true,search:false,editrules:{number:true,maxlength:10},
            editoptions: {
                dataInit: function (elem) { $(elem).focus(function () { this.select(); }) },
                dataEvents: [
                    {
                        type: 'keydown',
                        fn: function (e) {
                            var key = e.charCode || e.keyCode;
                            if (key == 13)//enter
                            {
                                var grid = $('#purchasedetailsgrid');
                                //Save editing for current row

                                grid.jqGrid('saveRow', selIRow, false, sitepath + 'purchase/purchase_grid');
                                selIRow++;
                                //If at bottom of grid, create new row
                                //if (selIRow++ == grid.getDataIDs().length) {
                                    grid.addRowData(selIRow, {});
                                //}
                                //Enter edit row for next row in grid
                                grid.jqGrid('editRow', selIRow, false, sitepath + 'purchase/purchase_grid');
                            }
                        }
                    }
                ]
            }
        }
    ],
    pager: '#purchasedetailstoolbar',
    rowNum:10,
    rowList:[10,20,30],
    sortname: 'inventory_id',
    sortorder: 'desc',
    viewrecords: true,
    rownumbers: true,
    gridview: true,
    multiselect: false,
    autoresize:true,
    autowidth: true,
    editurl: sitepath + 'purchase/purchase_grid',
    toolbar: [true,"top"],
    gridComplete: function () 
    {
        var grid = jQuery("#purchasedetailsgrid");
        var ids = grid.jqGrid('getDataIDs');
        if(ids == '')
        {
            grid.addRowData(selIRow, {});
            grid.jqGrid('editRow', selIRow, false, sitepath + 'purchase/purchase_grid');
        }
        for (var i = 0; i < ids.length; i++) 
        {

        }
    },
    caption: 'Purchase List',
}); 
jQuery("#purchasedetailsgrid").jqGrid('navGrid','#purchasedetailstoolbar',{view:false,edit:false,add:false,del:false,search: false});
jQuery("#purchasedetailsgrid").jqGrid('inlineNav','#purchasedetailstoolbar');
jQuery("#purchasedetailsgrid").jqGrid('filterToolbar',{stringResult:false,searchOnEnter : false},{autosearch: true});
var temp_purchase = $("#purchasedetailsgrid_header").html();
$("#t_purchasedetailsgrid").html(temp_purchase);
$("#refresh_purchasedetailsgrid").attr('title',"Reload Grid");

ある列から値を取得して別の列に割り当てる方法を誰かが提案できますか?

任意の提案をいただければ幸いです。

事前にt​​hnx

4

1 に答える 1

1

現在のコードには多くの問題があります。たとえば、数量とレートに基づいて金額を計算する必要があると書きましたがdataEvents、「数量」と「レート」の列ではなく、「レート」と「金額」の列でいくつかを定義しました。editRowの中でメソッドを直接使用する次の問題gridComplete。そのため、ツールバーのボタンinlineNavは間違った状態のままになります。もう1つの問題は、「qty」と「rate」からのフォーカスの喪失だけでなく、値を保存する際にも、「qty」と「rate」に基づいて「amount」を再計算する必要があることですEnter

上記の問題を簡単に解決するために、正確な要件に対応する変更可能なデモを作成しました。デモの最も重要な部分は次のとおりです。

var editingRowId = undefined,
    recomputeAmount = function () {
        var rate = $("#" + editingRowId + "_rate").val(),
            qty = $("#" + editingRowId + "_qty").val(),
            newAmount = parseFloat(rate) * parseFloat(qty);
        $("#" + editingRowId + "_amount").val(isFinite(newAmount) ? newAmount : 0);
    },
    myEditParam = {
        keys: true,
        oneditfunc: function (id) {
            editingRowId = id;
        },
        afterrestorefunc: function (id) {
            editingRowId = undefined;
        },
        aftersavefunc: function (id) {
            var $this = $(this),
                rate = $this.jqGrid("getCell", id, "rate"),
                qty = $this.jqGrid("getCell", id, "qty"),
                newAmount = parseFloat(rate) * parseFloat(qty);
            $this.jqGrid("setCell", id, "amount", newAmount);
            editingRowId = undefined;
        }
    },
    numInput = {
        type: 'keydown',
        fn: function (e) {
            var key = e.which;
            // allow only '0' <= key <= '9' or key = '.', Enter, Tab, Esc
            if ((key < 48 || key > 57) && key !== $.ui.keyCode.PERIOD &&
                key !== $.ui.keyCode.TAB && key !== $.ui.keyCode.ENTER && key !== $.ui.keyCode.ESCAPE) {
                return false;
            }
        }
    },
    recompute = {
        type: 'focusout',
        fn: function (e) {
            recomputeAmount();
        }
    };
$("#purchasedetailsgrid").jqGrid({
    colModel: [ 
        ...
        {name:'qty', index:'qty',editable:true,width:85,search:false,editrules:{number:true,maxlength:5},
            editoptions: {
                dataInit: function (elem) { $(elem).focus(function () { this.select(); }) },
                dataEvents: [ numInput, recompute ]
            }
        },
        {name:'rate', index:'rate',width:100,editable:true,search:false,editrules:{number:true,maxlength:10},
            editoptions: {
                dataInit: function (elem) { $(elem).focus(function () { this.select(); }) },
                dataEvents: [ numInput, recompute ]
            }
        },
        {name:'amount', index:'amount',width:100,editable:true,search:false,editrules:{number:true,maxlength:10}}
    ],
    loadComplete: function () {
        var gridIdSelector = '#' + $.jgrid.jqID(this.id);
        if (this.rows.length > 1) {
            //$(this).jqGrid('editRow', this.rows[1].id, myEditParam);
            $(this).jqGrid('setSelection', this.rows[1].id, true);
            setTimeout(function() {
                // we should simulate click of the button not after the grid is loaded, but
                // after the toolbar with the cliked button will be created by inlineNav
                $(gridIdSelector + "_iledit").click();
            }, 100);
        } else {
            setTimeout(function() {
                // we should simulate click of the button not after the grid is loaded, but
                // after the toolbar with the cliked button will be created by inlineNav
                $(gridIdSelector + "_iladd").click();
            }, 100);
        }
    }
 }); 
 jQuery("#purchasedetailsgrid").jqGrid('navGrid','#purchasedetailstoolbar',
     {view:false,edit:false,add:false,del:false,search: false, refreshtitle: "Reload Grid"});
 jQuery("#purchasedetailsgrid").jqGrid('inlineNav','#purchasedetailstoolbar',
     {edit: true, add: true, editParams: myEditParam, addParams: {addRowParams: myEditParam}});

必要に応じて、コードの不明な部分にコメントできます。

于 2012-05-19T16:38:45.467 に答える