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>');
}
我有一个使用表单编辑的网格设置。我希望用户只能编辑部分行。首先,我认为最简单的方法是在我的服务器查询中有一列(可能是隐藏的)和 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>');
}