jqGrid:有条件地隐藏/显示列内容**每行**

时间:2014-03-13 16:41:22

标签: struts2 jqgrid struts2-jquery struts2-jquery-grid struts2-jquery-plugin

是否有任何方法来定位某些行上的jqGrid(在我的例子中,Struts2-jQuery-Grid Plugin 3.7.0)中的列?

例如,我想仅在第1列值 电影 时显示第2列的内容:

 _______________________________________________________
|       COL 1       |               COL 2               |
|===================|===================================|
|   Movie           | bla bla yada yada                 |
|-------------------|-----------------------------------|
|   Song            |                                   |
|-------------------|-----------------------------------|
|   Clip            |                                   |
|-------------------|-----------------------------------|
|   Movie           | foo or bar that is the question...|
|-------------------|-----------------------------------|
|   Game            |                                   |
|___________________|___________________________________|

我已经尝试在GridColumnTaghiddencssClass字段中使用条件OGNL表达式,但是立即注意到它们对整个列进行了一次评估,而不是在每个& #34;迭代&#34 ;.

作为一种解决方法,我可以在填充网格后用javascript手动隐藏该行中的列,但这是一个黑客,我想知道是否有条件的干净解决方案"做东西"在每行的列上。

注意:我无法简单地删除源List中的内容(因为这很明显),因为我的实际案例中的COL 2是Boolean,表示为{{1 }}

2 个答案:

答案 0 :(得分:3)

您可以通过多种方式实施要求。其中一个最简单的方法是在需要隐藏的单元格上设置color: transparent; CSS。例如,您定义CSS规则

.hiddenCell { color: transparent; }

并将类hiddenCell分配给" COL 2"的指定单元格。您可以使用" COL 2"的cellattr属性。为它:

cellattr: function (rowId, val, item) {
    if (item.sent) {
        return " class='hiddenCell'";
    }
}

The demo演示了这种方法。方法的缺点 - 隐藏文本仍然存在于HTML页面上,因此可以根据需要进行检查。

另一种方法是使用自定义格式化程序。例如,您可以定义以下formatter回调

formatter: function (cellValue, options, item) {
    return item.sent ? "" : $.jgrid.htmlEncode(cellValue);
}

The demo演示了第二种方法。该方法的缺点 - 将自定义格式化程序的使用与另一个格式化程序(如上例中的formatter: "select")相结合有点困难。然而,人们也可以这样做:

formatter: function (cellValue, options, item, action) {
    return item.sent ?
        "" :
        $.fn.fmatter.call(
            this,
            "select",
            cellValue,
            options,
            item,
            action);
}

喜欢the next demo

如果您从服务器加载数据,那么最好的选择可能是修改输入数据(列#34; COL 2"的输入数据)在{ {1}}回调。有关代码示例,请参阅the answerthis one

答案 1 :(得分:0)

对于记录,问题中描述的(假)场景的解决方案(使用 Struts2-jQuery-Grid 插件而不是原始 jqGrid )将是:

<script>
   function conditionalFormatter(cellValue, options, rowObject) {
       return rowObject.type!="Movie" ? "&nbsp;" : $.jgrid.htmlEncode(cellValue);
   }
</script>

<s:url id="remoteurl" action="myStrutsAction" namespace="/myNamespace" />

<sjg:grid href="%{remoteurl}" dataType="json"  gridModel="gridModel" >
    <sjg:gridColumn title="Col 1" name="type" />
    <sjg:gridColumn title="Col 2" name="foo" formatter="conditionalFormatter" />
</sjg:grid>