jqGrid 只读一行

jqGrid Make a Row readonly

我有一个使用表单编辑的网格设置。我希望用户只能编辑部分行。首先,我认为最简单的方法是在我的服务器查询中有一列(可能是隐藏的)和 XML 表示用户拥有的访问权限或角色。所以本质上,网格现在有一个列 "Access Role",每行有 'Y' 或 'N'。 (其中 Y = 用户可以编辑,N = View/readonly)

我已经尝试了一些方法来实现它。我想到的最好的方法是使用 rowattr 函数,但我的使用存在缺陷,因为它隐藏了网格中的行(我不想隐藏它,只是只读):

function (rd) {
console.log('Row = '+rd.WWBPITM_SURROGATE_ID);
    if (rd.ACCROLE === "N") {
      console.log('RowAttr '+rd.ACCROLE);
        return {"style": "display:none"};
    }

这可能是一个开始,但我不确定从这里到哪里去,我不确定我是否使用 rowattr 找错了树。

我还尝试在 loadComplete 函数中使用 setCell,如下所示:

function GridComplete() {
  var grid = $('#list1');
  var rowids = grid.getDataIDs();
  var columnModels = grid.getGridParam().colModel;
  console.log('Check ACCROLE');
  // check each visible row
  for (var i = 0; i < rowids.length; i++) {
    var rowid = rowids[i];
    var data = grid.getRowData(rowid);
    console.log('ACCROLE for '+rowid+' is '+data.ACCROLE);
    if (data.ACCROLE == 'N') {       // view only
      // check each column
      //console.log(data);

      for (var j = 0; j < columnModels.length; j++) {
        var model = columnModels[j];

        if (model.editable) {
        console.log('Is Editable? '+model.editable);
          //grid.setCell(rowid, model.name, '', 'not-editable-cell', {editable: false, edithidden: true});
          grid.setCell(rowid, model.name, '', 'not-editable-cell', {editoptions: { readonly: 'readonly', disabled: 'disabled' }});
        }
      }
    }
  }
}

但是编辑选项似乎对此没有任何作用。

知道怎么做吗?

您没有提供太多关于如何更新行的信息(JQGrid 网页演示中描述了多种方法,但我猜测了一个可能的解决方案。我从此页面底部(inline_editing 的 trirand 网站 wiki)http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing 并进行了一些更改。

  • 增加了一个新的数据列securityGroup,填入'A'、'B'、'C'
  • 等数据
  • 在网格中显示了新的数据列
  • 该示例使用 onSelectRow 事件在您单击新行时开始编辑行。我更新了这个回调以检查 row['securityGroup'] 的值,并且只有在 securityGroupA
  • 中才启动 .editRow
  • JSFiddle 在 http://jsfiddle.net/brianwoelfel/52rrunar/

回调如下:

onSelectRow: function(id){
    var row = $(this).getLocalRow(id);

  if(id && id!==lastsel2){
    jQuery('#rowed5').restoreRow(lastsel2);
    if(row['securityGroup'] == 'A') {
        jQuery('#rowed5').editRow(id,true);
    }
      lastsel2=id;
  }
},

如果此方法对您不起作用,请提供有关您当前如何使用 jqGrid 进行编辑的更多信息。这个例子显然非常简单,甚至没有 post 到 PHP 或 mysql 或任何东西。

好的,感谢您解释表单编辑。下面是一个示例,说明如何使用表单编辑来防止对 jqGrid 的某些记录进行编辑:

  • 从这个 jqGrid 表单编辑示例开始:http://www.ok-soft-gmbh.com/jqGrid/MulticolumnEdit.htm
  • 在显示编辑表单之前使用 beforeInitData 事件检查您的数据。请注意,这已绑定到寻呼机对象。
  • 使用getGridParam 和getCell 方法获取您想要的当前值。在我的示例中,我获取了客户端名称
  • 添加您自己的业务逻辑以进行检查(我不允许在 'test2' 上进行编辑)
  • Return false 以防止弹出编辑表单。
  • 此示例仅处理编辑,不处理插入或删除。
  • 将示例中的 $grid.jqGrid("navGrid", "#pager",...) 替换为:

    $grid.jqGrid("navGrid", "#pager", {view: true}, 
        // Events for edit
        {
            beforeInitData: function (formid) {
                var selectedRow = jQuery("#list").jqGrid('getGridParam','selrow');  //get selected rows
                var selectedClient = $("#list").jqGrid('getCell', selectedRow, 'name');
                if(selectedClient == 'test2')
                {
                    alert('You are not allowed to edit records for client "' + selectedClient + '"');
                    return false;
                }
            }       
        },
        // Events for add
        {
            beforeShowForm: function (formid) {
            }       
        }
    );
    

如果对其他人有帮助,下面是我在表单编辑模式下实现只读行的方式,基于指定用户对每一行具有的访问级别的列:

在编辑选项中,使用 beforeShowForm 事件,如下所示:

beforeShowForm: function (formid) {
console.log('Checking for READONLY '+formid.name);                         
            var selectedRow = jQuery("#list1").jqGrid('getGridParam','selrow');  //get selected rows
            var selRole = $("#list1").jqGrid('getCell', selectedRow, 'ACCROLE');
            if(selRole == 'N' || selRole == 'S' || selRole == 'R')
            {
                //$("<div>Sorry, you do not have access to edit this record.</div>").dialog({title: "Access Denied"});
                formid.find("input,select,textarea")
                .prop("readonly", "readonly")
                .addClass("ui-state-disabled")
                .closest(".DataTD")
                .prev(".CaptionTD")
                .prop("disabled", true)
                .addClass("ui-state-disabled");

                formid.parent().find('#sData').hide();
                var title=$(".ui-jqdialog-title","#edithd"+"list1").html();
                title+=' - READONLY VIEW';
                $(".ui-jqdialog-title","#edithd"+"list1").html(title);
                formid.prepend('<span style="color: Red; font-size: 1em; font-weight: bold;">You viewing READONLY data.</span>');

            }