jqgrid - 'setCell' 在 Frozen 列中不起作用

jqgrid - 'setCell' is not working in Frozen column

我有一个具有冻结列的 jqgrid。我必须更新冻结列中的单元格值,但它不起作用。

这是提琴手:https://jsfiddle.net/99x50s2s/5/

HTML

<table id="sg2"></table>
<div id="psg2"></div>

 <br>

<button type='button' id="SetGrid2">Update 'client' in first row of Grid 2</button>

JAVASCRIPT

jQuery("#sg2").jqGrid({
    datatype: "local",
    gridview: true,
    loadonce: true,
    shrinkToFit: false,
    autoencode: true,
    width:500,
    height: 'auto',
    viewrecords: true,
    sortorder: "desc",
    scrollrows: true,
    loadui: 'disable',
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
    colModel:[
        {name:'id',index:'id', width:60, sorttype:"int",frozen: true },
        {name:'invdate',index:'invdate', width:90, sorttype:"date",frozen: true },
        {name:'name',index:'name', width:100,frozen: true },
        {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
        {name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},     
        {name:'total',index:'total', width:80,align:"right",sorttype:"float"},      
        {name:'note',index:'note', width:150, sortable:false}       
    ],
    caption: "Grid 2 - with Frozen columns"
}).jqGrid('setFrozenColumns');

var mydata = [
        {id:"1",invdate:"2007-10-01",name:"test 1234567890123456789",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
        {id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"}
        ];

for(var i=0;i<=mydata.length;i++)
    jQuery("#sg2").jqGrid('addRowData',i+1,mydata[i]);


$('#SetGrid2').on('click', function(){
    jQuery("#sg2").jqGrid('setCell', 1, 'name', 'Updated');
});

我在 jqgrid 中使用 'setCell' 功能来设置单元格值。如果冻结的 属性 从该列中删除,或者如果该列已排序,我将看到新值。

我是否遗漏了任何特定于冻结列的内容?

环境:jqgrid插件4.6.0,IE 9

应用的解决方案:

就我而言,我无法将 jqGrid 插件更新到最新版本。因此,销毁并设置冻结列作为解决方法,效果很好。

           myGrid.jqGrid('destroyFrozenColumns');

           if (rowData.Id == 0) {
               myGrid.jqGrid('setCell', rowid, 'Edit', 'New');
           }
           else {
               myGrid.jqGrid('setCell', rowid, 'Edit', null);
           }

           myGrid.jqGrid('setFrozenColumns');

没错。 jqGrid 4.6.0 不支持 setCellsetRowData 以及单元格或内联编辑与冻结列的组合。我最近才在 free jqGrid 中实现了该功能(在发布免费的 jqGrid 4.8 之后)。我还从本质上改进了冻结列的性能。

您可以验证修改后的演示 https://jsfiddle.net/OlegKi/99x50s2s/9/ 是否正常工作。

我建议您不要使用 addRowData 填充网格,而应使用 data: mydata。此外,如果您使用相同的 rowids 填充多个网格,则应使用 idPrefix(两个网格的值不同):

idPrefix: "g1_",

您当然可以使用免费 jqGrid 的许多新功能。 The wiki and readme https://jsfiddle.net/OlegKi/99x50s2s/11/

unclear from the wiki,但是无法编辑冻结的列(包括setCell函数。)

这可以通过解冻列、设置单元格值,然后在 'click' 事件结束时再次冻结它们来处理:

$('#SetGrid2').on('click', function(){
    jQuery('#sg2').jqGrid('destroyFrozenColumns');
    var cell = jQuery("#sg2").jqGrid('setCell', 1, 'name', 'Updated');
    jQuery('#sg2').jqGrid('setFrozenColumns');
});

Working Fiddle

[后人注意事项] - 如果你想动态更改哪些列被冻结,你可以通过解冻 - setting/unsetting 冻结 - 然后重新冻结来实现,但是您还必须致电 trigger.

// freezes the amount col as well...
$('#SetGrid2').on('click', function(){
   jQuery("#sg2")
   .jqGrid('destroyFrozenColumns')
   .jqGrid('setColProp','amount', {frozen:true})
   .jqGrid('setFrozenColumns')
   .trigger('reloadGrid', [{current:true}])
});

Another Fiddle