jqGrid只读一行

时间:2015-02-17 20:59:36

标签: jqgrid

我使用表单编辑进行网格设置。我希望用户只能编辑一些行。首先,我认为最简单的方法是在我的服务器查询中使用一个列(可能是隐藏的)和表示用户具有的访问权限或角色的XML。所以基本上网格现在有一个“访问角色”列,每行有'Y'或'N'。 (其中Y =用户可以编辑,N =查看/只读)

我已经尝试了几件事来实现这一点。我提出的最好的是使用rowattr函数,但我的使用是有缺陷的,因为它隐藏了网格中的行(我不想隐藏它,只是readonly):

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' }});
        }
      }
    }
  }
}

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

任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:1)

好的,谢谢你解释表格编辑。以下是如何使用表单编辑阻止对jqGrid的某些记录进行编辑的示例:

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

    $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) {
            }       
        }
    );
    

答案 1 :(得分:0)

您没有提供有关如何更新行的大量信息(JQGrid网页演示中描述了各种方法,但我猜测了可能的解决方案。我从底部的示例开始这个页面(trirand的网站wiki for inline_editing)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进行编辑的详细信息。这个例子显然非常简单,甚至不会发布到PHP或mysql或任何东西。

答案 2 :(得分:0)

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

在editoptions中,使用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>');

            }