如果colmodel中的名称是整数,如何在jqGrid中设置单元格?

时间:2015-04-23 14:16:57

标签: jqgrid

当colmodel中的名称是整数时,

jqgrid setcell会导致问题。它给出了错误:

  

未捕获的TypeError:无法读取属性' formatter'未定义的。

我添加grid.locale-en.jsjqgrid-min.js的顺序是正确的。

要精确错误就在行中:

var h = a.p.colModel[e]; if (h.formatter !== void 0) 

jqgrid-min.js中,其中是colmodel名称(注意这是一个整数)。

这是我设置单元格的方式。

$("#GoingCostLogGrid").jqGrid('setCell', rowId, Costs_ProjectOrProgram , cellValue_CurrentTotalforAllFY);

其中Costs_ProjectOrProgram是一个整数,也是colmodel中的列名。

1 个答案:

答案 0 :(得分:0)

如果您使用数字(例如setCell)作为参数调用12或使用包含该数字的字符串(如"12"),则大差异 。 number参数将被解释为colModel数组中的索引,但字符串值将被解释为列名

因此,如果Costs_ProjectOrProgram的类型是数字,并且您想将其解释为字符串,那么您应该将该变量转换为字符串。所以你应该使用

$("#GoingCostLogGrid").jqGrid('setCell', rowId, String(Costs_ProjectOrProgram),
    cellValue_CurrentTotalforAllFY);

而不是

$("#GoingCostLogGrid").jqGrid('setCell', rowId, Costs_ProjectOrProgram,
    cellValue_CurrentTotalforAllFY);

顺便说一下,使用具有第一个大写字符的变量非常糟糕。对应于JavaScript的名称转换,应该使用这样的名称仅用于构造函数(类的构造函数)。这很容易看出如何使用标识符。例如,即使您在上述var d = new Date(2015, 3, 24);用法的情况下在许多网络浏览器中获得相同的结果,也需要使用var d = Date(2015, 3, 24);而不是Date。你可以看到,即使是JavaScript代码的格式化程序也会以另一种颜色显示具有第一个大写字符的标识,以强调它具有另一种含义作为标准变量(cellValue_CurrentTotalforAllFY for例)。我严格建议您保留以您使用的语言存在的名称转换。

更新:jqGrid执行以下操作:在setCell代码的开头,它尝试使用isNaN(colname)将列名参数转换为数字。如果列名是包含数字的数字或字符串,那么它将被解释为作为列的索引(请参阅the lines)。因此,要解决此问题,您必须使用setCellgetCellgetCol以及许多其他方法来使用列的索引而不是名称。所以你必须做以下

var colModel = $("#GoingCostLogGrid").jqGrid("getGridParam", "colModel"),
    iCol, nCol = colModel.length; 

for (iCol = 0; iCol < nCol; iCol++) {
    if (colModel[iCol].name === Costs_ProjectOrProgram) {
        $("#GoingCostLogGrid").jqGrid("setCell", rowId, iCol,
            cellValue_CurrentTotalforAllFY);
    }
}

如果您有许多地方需要这样做,那么您可以通过功能中的列名搜索列索引,并在需要时调用。

如果您使用free jqGrid而不是jqGrid 4.6,那么即使在使用jsonmap的情况下也可以使用datatype: "local"。有关详细信息,请参阅the wiki article。您可以将列定义为{name: "c5", jsonmap: "5"}而不是使用{name: "5"},并具有上述问题。或者,您可以更改输入数据,以便输入数据的属性以字母开头。