jqGrid - 禁用内联下拉菜单"编辑"但不是"添加"

时间:2014-11-18 15:31:29

标签: javascript jquery jqgrid inline-editing

看起来这个问题至少被问过once before,但没有得到回答。我也看到这个问题的答案是关于标准的“表单”编辑,但不是内联。

代码

$(function() {
var lastSel;
var MSVendors = {'9990':'XXXXXX - LEXI','9991':'XXXXXX - RICH','9992':'XXXXXX - BIRM','9993':'XXXXXX - PEMB' };
$('#special_dialog').dialog({
    width:'auto',
    height:'auto',
    resizable:true
});
$.extend($.jgrid.defaults,{
    rowNum:250,
    rowList:[1000,2500,5000],
    viewrecords:true,
    sortorder:'asc',
    height:800,
    autowidth:true,
    deepempty:true,
    altRows: true,
    grouping: true,
    groupingView: {
        groupField: ["vendor"],
        groupColumnShow: [true],
        groupText: ["<b>WAREHOUSE : {0}</b>"],
        groupDataSorted: true,
        groupSummary: [false]
    }
});
var surplusGrid = $('#surplusGrid'),
    editingRowId,
    sEditParam = {
        keys: true,
        oneditfunc: function(id) {
            editingRowId = id;
            $('#surplusGrid_ilsave').removeClass('ui-state-disabled');
            $('#surplusGrid_ilcancel').removeClass('ui-state-disabled');
        },
        afterrestorefunc: function() {
            editingRowId = undefined;
        }
    },
    sAutoCompOpts = {
        source: function(request, response) {
            $.getJSON('/json/json.searchmultiMaterials.php',{term:request.term,type:'m'},function(data) {
                response(data);
            });
        },
        minLength: 3,
        focus: function(e,ui) {
            $('input:text[name="description"]').val(ui.item.description);
            $('input:text[name="vendor"]').val(ui.item.vendor);
            $('input:text[name="mfgr_partno"]').val(ui.item.mfgr_partno);
        },
        select: function(e,ui) {
            $('input:text[name="description"]').val(ui.item.description);
            $('input:text[name="vendor"]').val(ui.item.vendor);
            $('input:text[name="mfgr_partno"]').val(ui.item.mfgr_partno);
        }
    },
    sAddParam = {
        rowID: 'new',
        position:'last'
    };
surplusGrid.jqGrid({
    url: '/json/json.getSurplusStock.php',
    datatype:'json',
    emptyrecords: 'Surplus Stock is currently depleted!',
    colNames: ['ID','Type','Part#','Description','On-Hand','On-Order','On-Hold','Min Stock','Warehouse','Shelf','Bin'],
    colModel: [
        {   name:'id',
            index:'id',
            hidden:true,
            key:false,
            search:false,
            viewable:false
        },
        {   name:'type',
            index:'type',
            width:35,
            sortable:true,
            editable:false,
            align:'center',
            editoptions:{defaultValue:'B'},
            cellattr: function(rowId,val) {
                if (val == 'B') {
                    return 'class="blue_stock"';
                } else {
                    return 'class="gold_stock"';
                }
            }
        },
        {   name:'surplus_partno',
            index:'surplus_partno',
            width:140,
            sortable:false,
            editable:true,
            classes:'ui-ellipsis',
            edittype:'text',
            editoptions:{size:25},
            editrules:{required:true}
        },
        {   name:'description',
            index:'description',
            width:200,
            sortable:false,
            align:'left',
            editable:true,
            classes:'ui-ellipsis',
            edittype:'text',
            editoptions:{size:40},
            editrules:{required:true}
        },
        {   name:'on_hand',
            index:'on_hand',
            width:60,
            sortable:false,
            editable:true,
            align:'center',
            edittype:'text',
            editoptions:{size:6},
            editrules:{required:true,integer:true,minValue:0}
        },
        {   name:'on_order',
            index:'on_order',
            width:60,
            sortable:false,
            editable:true,
            align:'center',
            edittype:'text',
            editoptions:{size:6},
            editrules:{required:false,integer:true,minValue:0}
        },
        {   name:'on_hold',
            index:'on_hold',
            width:60,
            sortable:true,
            editable:true,
            align:'center',
            edittype:'text',
            editoptions:{size:6},
            editrules:{required:true,integer:true}
        },
        {   name:'min_threshold',
            index:'min_threshold',
            width:60,
            sortable:true,
            editable:true,
            align:'center',
            edittype:'text',
            editoptions:{size:6},
            editrules:{required:true,integer:true,minValue:0}
        },
        {   name:'vendor',
            index:'vendor',
            width:120,
            editable:true,
            align:'center',
            editoptions:{value:MSVendors},
            edittype:'select',
            editrules:{required:true,integer:true}
        },
        {   name:'shelf',
            index:'shelf',
            width:40,
            sortable:true,
            editable:true,
            align:'center',
            editoptions:{size:10}
        },
        {   name:'bin',
            index:'bin',
            width:40,
            sortable:true,
            editable:true,
            align:'center',
            editoptions:{size:10}
        }
    ],
    pager:'#surplusFoot',
    sortname:'b.id',
    caption:'Surplus Stock Inventory',
    onSelectRow: function(id) {
        if(id && id !== lastSel) {
            surplusGrid.jqGrid('restoreRow',lastSel);
            var cm = surplusGrid.jqGrid('getColProp','vendor');
            if (id != 'new') { cm.editable = false; }
            lastSel = id;
        }
        surplusGrid.jqGrid('editRow',id,true);
        $('#surplusGrid_ilsave').removeClass('ui-state-disabled');
        $('#surplusGrid_ilcancel').removeClass('ui-state-disabled');
    },
    editurl:'/jqg/jqg.saveSurplusStockEdit.php'
});
surplusGrid.jqGrid('navGrid','#surplusFoot',{
    add:false,
    edit:false,
    del:false
});
surplusGrid.jqGrid('inlineNav','#surplusFoot',{
    add:true,
    edit:true,
    editParams:sEditParam,
    addParams:sAddParam
});
// re-size all grids when dialog box resizes
$('#special_dialog').dialog({
    resizeStop: function(e,ui) {
        surplusGrid.jqGrid('setGridWidth', ui.size.width - 30);
    }
});

});

在内联ADD上运行GREAT - 显示下拉列表,并按预期将值传递到编辑URL。但是,在内联编辑中,整个下拉列表消失,留下一个“”作为单元格内容,而不是网格最初加载时的值。

1 个答案:

答案 0 :(得分:1)

inlineNav的使用是内联编辑的一个特例,因为将调用editRow。从jqGrid开始4.5.3内联编辑支持beforeEditRowbeforeAddRow回调,这些回调主要是为了在使用inlineNav时提供额外的自定义。方法beforeEditRow更有趣,因为它会以任何方式调用editRow

在提供使用示例beforeEditRow之前,我要注意您必须修复sAddParam中的错误,该错误用作addRow的选项。您使用不需要的和危险参数rowID: 'new'。结果,每个新行的ID将是相同的:“new”。在你的方式你将有id重复。早期版本的jqGrid也存在同样的问题。如果$.jgrid.randId()rowIDnull,则当前版本的jqGrid会使用undefined为新添加的行生成新的唯一 ID。 rowID的默认值为null。因此,我严格建议您删除rowID: 'new'选项。

下一个重要的事情是addParams的{​​{1}}选项的含义。方法inlineNav在内部调用相同的addRow方法。 editRow的{​​{1}}属性允许指定由addRowParams调用的addParams选项。因此,我严格建议您使用以下格式的editRow

addRow

通过这种方式,您将确保即使在使用addParams的情况下也会应用内联编辑的所有回调和选项。

现在回到你的主要问题。我建议您使用var sEditParam = { ... // any options or callbacks }, sAddParam = { position: 'last', addRowParams: sEditParam }; 更改addRow列的beforeEditRow属性。为了测试当前行是否只是添加,我建议测试editable类的存在。相应的代码可能类似于以下

vendor