【发布时间】:2011-11-27 20:12:50
【问题描述】:
是否可以对数据行和摘要行使用不同的格式化程序?例如,我想将摘要信息 (summaryType=count) 添加到复选框格式的列中,摘要值显示为选中的复选框。有什么想法吗?
种类,阿尔珀
你可以看到来自here的截图:
【问题讨论】:
是否可以对数据行和摘要行使用不同的格式化程序?例如,我想将摘要信息 (summaryType=count) 添加到复选框格式的列中,摘要值显示为选中的复选框。有什么想法吗?
种类,阿尔珀
你可以看到来自here的截图:
【问题讨论】:
我发现你的问题很有趣,因为我没有立即知道答案。现在有时间重新阅读了jqGrid的分组模块的源代码,并创建了一个您需要的示例。
首先我准备了the demo,它显示以下结果:
如何查看摘要行有许多以不同方式格式化的元素:
要在每个分组块的末尾有摘要行,我们需要在 jqGrid 的 groupingView 参数中定义 groupSummary: [true] 属性。然后我们需要为 colModel 中汇总行没有空单元格的所有列定义summaryType 属性。
例如,在最简单的情况下,我为列'amount' 定义了属性summaryType: 'sum'。
对于'tax' 列,我另外定义了summaryTpl:
summaryTpl: '<i>{0}</i>', summaryType: 'sum'
因此,'tax' 列的摘要包含斜体文本。
对于'total' 列,我使用不同的颜色取决于显示的值。值为 grater 为 1000 的结果以绿色显示。其他值以红色显示。该实现是摘要行的真正自定义格式化程序:
//formatter: 'number',
formatter: function (cellval, opts, rwdat, act) {
if (opts.rowId === "") {
if (cellval > 1000) {
return '<span style="color:green">' +
$.fn.fmatter('number', cellval, opts, rwdat, act) +
'</span>';
} else {
return '<span style="color:red">' +
$.fn.fmatter('number', cellval, opts, rwdat, act) +
'</span>';
}
} else {
return $.fn.fmatter('number', cellval, opts, rwdat, act);
}
},
summaryType: 'sum'
我使用自定义格式化程序而不是 formatter: 'number'。我不想再实现一次formatter: 'number',所以我调用了关于$.fn.fmatter('number', cellval, opts, rwdat, act) 的预定义“数字”格式化程序。
以上代码最重要的部分是这一行
if (opts.rowId === "") {
在格式化网格单元格期间,将调用自定义格式化程序,并将 opts.rowId 初始化为行 ID。只有在格式化摘要行的情况下,opts.rowId 才会是空字符串 ("")。我使用事实来实现自定义格式。
在'closed' 专栏中,我又展示了一个技巧。我使用定义为函数的summaryType。可以使用它来进行一些自定义汇总计算,另一种作为标准类型:“sum”、“min”、“max”、“count”和“avg”。在演示中,我显示所有复选框的“计数”和选定复选框的“计数”,并在摘要中显示结果。此外,摘要单元格还有一个复选框,如果该组中至少有一个复选框被选中,则该复选框被选中。包含自定义格式化程序的相应代码如下:
formatter: function (cellval, opts, rwdat, act) {
if (opts.rowId === "") {
return '<span style="display:inline-block;top:-2px;position:relative;">' +
cellval.checkedCount + ' of ' + cellval.totalCount + '</span> ' +
$.fn.fmatter('checkbox', cellval.max, opts, rwdat, act);
} else {
return $.fn.fmatter('checkbox', cellval, opts, rwdat, act);
}
},
summaryType: function (val, name, record) {
if (typeof (val) === "string") {
val = {max: false, totalCount: 0, checkedCount: 0};
}
val.totalCount += 1;
if (record[name]) {
val.checkedCount += 1;
val.max = true;
}
return val;
}
我们需要保存我们计算的树不同的值:totalCount、checkedCount 和 max。上面的代码显示可以将初始字符串val 参数更改为包含我们需要的所有信息的对象。在格式化摘要行期间,将调用自定义格式化程序,并将 cellval 初始化为我们之前创建的 val 对象。以这种方式我们可以保存任何自定义信息然后显示它。
我希望关于演示,您将能够创建您需要的任何摘要分组行。
【讨论】:
您是否使用自定义格式化程序?您可以做的是制作自定义格式化程序以根据输入显示不同的内容。我不确定您是返回 true 还是 false 作为您的输入,但是这应该可以工作:
function checkboxFormatter(cellvalue,options,rowObject){
if(typeof cellvalue == "number"){
return cellvalue;
}
else if(cellvalue == "true"){
return '<input type="checkbox" checked="checked" />';
}
else{
return '<input type="checkbox" />';
}
}
如果您有任何问题或与您的想法不同,请告诉我
【讨论】: