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


当colmodel中的名称为整数时,jqgrid setcell会导致问题。它给出错误:

未捕获类型错误:无法读取未定义的属性"formatter"。

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

准确地说,错误在一行:

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

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

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

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

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

如果使用数字(如12)作为参数或使用包含数字的字符串(如"12")调用setCell,则存在大差异。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的情况下,您在许多web浏览器中可能会得到相同的结果。您可以看到,即使是JavaScript代码的格式化程序也会用另一种颜色显示具有第一个大写字符的identity,以强调它作为标准变量具有另一种含义(例如cellValue_CurrentTotalforAllFY)。我强烈建议您保留您使用的语言中存在的名称转换。

更新:jqGrid执行以下操作:在setCell代码的开头,它尝试使用isNaN(colname)将列名参数转换为数字。如果列名是数字或包含数字的字符串,则它将被解释为列的索引(请参见行)。因此,为了解决这个问题,必须使用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);
}
}

如果有很多地方需要这样做,那么可以将按列名搜索列索引放在函数中,并在需要时调用If。

如果您要使用免费的jqGrid而不是jqGrid 4.6,那么即使在使用datatype: "local"的情况下也可以使用jsonmap。有关详细信息,请参阅wiki文章。通过这种方式,您可以将列定义为{name: "c5", jsonmap: "5"},而不是使用{name: "5"},从而出现上述问题。或者,您可以更改输入数据,使输入数据的属性以字母开头。

相关内容

最新更新