【问题标题】:jQgrid: Disable checkbox and row (conditional)jQgrid:禁用复选框和行(条件)
【发布时间】:2016-08-02 03:32:28
【问题描述】:

基于从 PHP 数据数组传递的flag_status,我需要禁用行和复选框。此外,防止选择禁用的行以支持多选列标题中的select all 复选框

jQuery("#grid").jqGrid({
    url:call_url,
        datatype: "json",
    height: 'auto',
    rowNum: 20,
    rowList: [20,30,40],
    colNames:[<?php echo $col;?>],
    colModel:[
                {name:'USER_ID',index:'USER_ID', align:'center',search:false,hidden:true,key:true},
        {name:'PROJECT_NAME',index:'PROJECT_NAME', align:'center',search:false,hidden: true},
        {name:'EMP_NAME',index:'EMP_NAME', sortable:true,summaryType:'count',summaryTpl : 'Total ({0}) Resource Hours' },
        <?php for($i=1;$i<=count($cal_arr);$i++) {?>
        {name:'<?php echo $i;?>',index:'<?php echo $i;?>',search:false,align:"center",sortable:false ,width:80 },
        <?php } ?>
    ],
    pager: "#page",
        multiselect: true,
    shrinkToFit :true,
    autowidth: true,
    viewrecords: true,
    grouping: true, 
    groupingView : { groupField : ['PROJECT_NAME'], 
                    groupColumnShow : [false], 
                    groupText : ['<b>{0}</b>'],
                    groupCollapse : false, 
                    groupOrder: ['asc'], 
                    groupSummary : [true], 
                    showSummaryOnHide: true,
                    groupDataSorted : true },
    sortname: 'EMP_NAME',
    caption: "Programatically block selection of some grid row',
    gridComplete: function () {
                    var recs = $("#grid").getGridParam("records");
                    $( ".mycontent" ).remove();
                    if (recs == 0 || recs == null) {
                        $('#grid').after("<div class='mycontent' style='color:red;text-align:center'>No Record Found</div>");
                        $("#btn_submit").hide();
                    }
            },


            loadComplete: function() {
                // we make all even rows "protected", so that will be not selectable
                var cbs = $("tr.jqgrow > td > input.cbox:even", jQuery("#grid")[0]);
                cbs.attr("disabled", "disabled");
            },
            beforeSelectRow: function(rowid, e) {
                var cbsdis = $("tr#"+rowid+".jqgrow > td > input.cbox:disabled", jQuery("#grid")[0]);
                if (cbsdis.length === 0) {
                    return true;    // allow select the row
                } else {
                    return false;   // not allow select the row
                }
            },
            onSelectAll: function(aRowids,status) {
                if (status) {
                    // uncheck "protected" rows
                    var cbs = $("tr.jqgrow > td > input.cbox:disabled", jQuery("#grid")[0]);
                    cbs.removeAttr("checked");

                    //modify the selarrrow parameter
                    jQuery("#grid")[0].p.selarrrow = jQuery("#grid").find("tr.jqgrow:has(td > input.cbox:checked)")
                        .map(function() { return this.id; }) // convert to set of ids
                        .get(); // convert to instance of Array
                }
            }

})

感谢@Oleg 提供小号demo,但不完全满足以下要求。

不能将key:true 用于flag_status,因为它的bieng 用于user_id

这里它会禁用所有偶数行,因此无法选择,但只有当值为flag_status = 1 时才需要禁用。如何在 jQgrid 中传递该值并禁用行(添加类ui-state-disabled)并防止选中复选框(使其也被禁用)?

HTML 结构:

<tr class="ui-widget-content jqgrow ui-row-ltr" tabindex="-1" id="13234" role="row" aria-selected="false">
<td aria-describedby="grid_cb" style="text-align:center;width: 20px;" role="gridcell">
<input type="checkbox" name="jqg_grid_13234" class="cbox" id="jqg_grid_13234" role="checkbox" disabled="disabled">
</td>
</tr>

这里USER_ID 设置在&lt;tr&gt;&lt;input&gt; 上,而flag_status 应该设置在&lt;tr&gt;USER_ID&lt;input&gt;。如果 flag_status 值为1,则应将ui-state-disabled 类添加到&lt;tr&gt; 中,使&lt;input&gt; 禁用。

版本 - jqGrid 4.6.0

【问题讨论】:

  • 你在 jqGrid 中使用了哪个 datatype?如果您通过 Ajax 加载数据(datatype"json""xml")那么另一个问题:您是否使用 loadonce: true?换句话说,重要的是要知道您在网格中是否有 local data?你写了关于key:trueuser_id,但你没有发布任何网格定义(没有colModel 也没有测试数据)。了解哪个 fork 或 jqGrid(旧的 jqGrid 直到 4.7、free jqGridGuriddo jqGrid JS)以及您使用哪个版本很重要
  • @Oleg,请找到更新后的问题内容并提供更多详细信息

标签: jquery jqgrid


【解决方案1】:

您引用的我的演示已经很老了。我修改为the following,更符合你的要求。

我在演示中使用

rowattr: function (item) {
    if (parseInt(item.ID, 10) % 3 === 0) {
        return {"class": "ui-state-disabled ui-jqgrid-disablePointerEvents"};
    }
},
beforeSelectRow: function (rowid, e) {
    if ($(e.target).closest("tr.jqgrow").hasClass("ui-state-disabled")) {
        return false;   // not allow select the row
    }
    return true;    // allow select the row
}

ui-jqgrid-disablePointerEvents 类的 CSS 规则如下:

.ui-jqgrid-disablePointerEvents {
    pointer-events: none;
}

您可以轻松修改rowattr 的代码,以便根据item.flag_status 的值禁用行,而不是我在上面的演示中使用的item.ID

【讨论】:

  • Oleg: pointer-events: none; 禁用行点击。如何仅禁用复选框,同时保持所有超链接可点击?
  • 如果您能解释为什么不使用loadCompleteonSelectAll,那就太好了
  • @Slimshadddyyy:rowattrloadComplete 更有效。设置类 ui-state-disabled 通知 selectAll 不要选择行(例如,参见 the line)。所以不需要额外的onSelectAll。关于禁用您在问题中自己编写的行(请参阅“禁用行(添加类 ui-state-disabled)”)。如果您需要允许在行内点击,那么您应该回到旧代码,它会更慢,但它会起作用。
  • @Slimshadddyyy:在beforeSelectRow 内部使用flag_status 而不用数据创建隐藏行或将信息保存在行或某个单元格的data-flag_status 中似乎是不可能的。您应该决定在填充网格期间需要在哪里保存信息。通过添加隐藏的flag_status 列和使用getCell 来从beforeSelectRow 内部的列中获取数据,您可以获得快速而简单的解决方案。
  • Oleg:感谢您的详细解释。我真的很感激。是的,我需要禁用灰色的行,但是在该行中,复选框不能选择,而如果该行中存在任何链接,则应该是可点击的。
猜你喜欢
  • 2011-07-12
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多