jqgrid创建后如何应用column template

How to apply column template after jqgrid is created

免费的jqgrid创建后不能应用列模板。 我试过了

  var newOrderPriceTemplate = {
    align: "center",
    formatter: "showlink",
    formatoptions: {
        onClick: function() { alert('clicked'); }
    }
    };

    $(function () {
      ... code to create jqgrid into $grid
      $grid.jqGrid('setColProp', 'Hind', {
        template: newOrderPriceTemplate,
        search: false
    }); 
    });

如果在列中单击,则不会出现警告框。 search: false 正确删除搜索字段,以便执行 setColProp。

如何在创建 jqgrid 之后但在显示之前应用 newOrderPriceTemplate。 如果在创建时在 colModel 中指定了模板,它就可以工作。

最新的免费 jqgrid,jquery,bootstrap3,aps.net 使用 mvc4,.net 4.6。

我认为对模板的工作方式存在误解。模板只不过是将在 $.extend 中用于将 colModel 中的一些当前属性与 template 属性的另一个对象组合的设置列表。

我建议阅读免费 jqGrid 的代码 the code fragment。简化形式的代码看起来像

for (iCol = 0; iCol < p.colModel.length; iCol++) {
    p.colModel[iCol] = $.extend(true, {},
        p.cmTemplate,
        p.colModel[iCol].template || {},
        p.colModel[iCol]);
}

换句话说,jqGrid 将列的 cmTemplatetemplate 属性 的值与 colModel 的 属性 相结合。 jqGrid 在创建网格的开始 时完成。

因此,如果您有一些模板(例如newOrderPriceTemplate),您需要在创建网格后应用,那么您只需要使用$.extend 手动扩展(并覆盖)现有属性:

var p = $grid.jqGrid("getGridParam");

p.colModel[p.iColByName.Hind] = $.extend(true, {},
    p.colModel[p.iColByName.Hind], // old values
    newOrderPriceTemplate,         // the applied template
    { search: false }              // one more setting to apply
);

重要的是将新属性 放在 来自 p.colModel[p.iColByName.Hind] 的当前设置之后以便能够在那里覆盖。