【问题标题】:How can I set the cell in a jqGrid if the name in colmodel is an integer?如果 colmodel 中的名称是整数,如何在 jqGrid 中设置单元格?
【发布时间】:2015-04-23 14:16:57
【问题描述】:

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

未捕获的类型错误:无法读取未定义的属性“格式化程序”。

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

准确地说,错误在该行中:

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

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

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

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

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

【问题讨论】:

  • 你使用什么版本的 jqGrid? 你应该包含 non-minimized 文件的行号(jquery.jqgrid.src.jsjquery.jqgrid.js 取决于您使用哪个版本)。你的意思是“colmodel 中的名称是一个整数”?您使用哪个值? (0123 或 ...)。名称始终为 string。所以你应该至少使用"0""123" 而不是0123。为什么你使用如此奇怪的列名呢?为什么不将名称改为"c1""c2""c3"、...而不是"1""2""3"、...?
  • 我一直在使用 jqGrid 4.6.0 - jQuery Grid (jquery.jqGrid.src.js) 确切的行号是 1121 [ if(cm.formatter !== undefined) ]。
  • 表示你调用formatter函数时使用了错误的colpos参数。我问了你多个问题,但你只回答了第一个问题。
  • 我一直在使用 jqGrid 4.6.0 - jQuery Grid (jquery.jqGrid.src.js) 确切的行号是 1121 [ if(cm.formatter !== undefined) ]。 colmodel 中的 name 属性也是一个整数,如 "51" 或 "52" 带双引号。将整数作为名称属性的原因是我一直在使用 quickbase,它是数据库中数据的字段 ID。我一直在使用 quickbase api 单独获取数据,并且使用本地数据类型作为特定数据的集成是格式 var data = {["51" : "USA", "52" : "BID done" ,"53" : "Paid"]}
  • 您使用哪个datatype?如果您使用datatype: "json",那么您可以使用colModeljsonmap 属性。它指定输入属性的值。顺便说一句,var data = {["51" : "USA", "52" : "BID done" ,"53" : "Paid"]} 有语法错误。你的意思可能是 `var data = [{"51" : "USA", "52" : "BID done" ,"53" : "Paid"}]. I don't recommend you to use numbers as the value of name 属性在colModel。从那里您可能只会遇到其他问题。可以轻松使用name 值,这些值对应于 CSS 的 id 规则。确切的实现(如jsonmap)取决于细节。

标签: jqgrid


【解决方案1】:

如果您使用数字(如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 代码的格式化程序也会以另一种颜色显示具有第一个大写字符的标识,以强调它作为标准变量具有 另一种含义(例如cellValue_CurrentTotalforAllFY) .我强烈建议您保留您使用的语言中存在的名称转换。

更新: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,那么即使在使用datatype: "local" 的情况下,您也可以使用jsonmap。有关详细信息,请参阅the wiki article。以这种方式,您可以将列定义为{name: "c5", jsonmap: "5"} 而不是使用{name: "5"} 并具有上述问题。或者,您可以更改输入数据,使输入数据的属性以字母开头。

【讨论】:

  • 是的,我一直保持名称转换。它只是为了显示在这里我已经缩短了一点全名为var = tblFundingDeclaredTableCost_ProjectProgram。我已经尝试过您提到的解决方案,但仍然存在相同的错误。
  • @ZohebKadiwal:如果您希望有人帮助您解决问题,您应该明白应该包含有关您的实施的更多详细信息。您应该准确 var = tblFundingDeclaredTableCost_ProjectProgram 例如语法错误。如果您在调用setCell 时出错,那么您应该包含您使用的参数的确切值 并包含所有引用。例如tblFundingDeclaredTableCost_ProjectProgram 等于"12",您可以在colModel 中列定义为{name: "12", ... }...
  • @ZohebKadiwal:我发布了 已更新部分答案。
  • @ZohebKadiwal:不客气!我建议您发布重现问题的演示。例如,您可以在 JSFiddle 中创建它。该演示应使用非最小化的 jqGrid 版本。以jsfiddle.net/OlegKi/o6g9rnug 为例。您可以修改现有的 jsfiddle.net,保存并发布 url。可以调试具有重现问题的演示的代码。所以可以很快找到问题的解决方案。这将节省您和回答您问题的人的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多