注意:根据Oleg建议我已实施格式化程序:'select'属性下拉列表以获取custom func
我将jQgrid从版本4.8.2升级到4.9.2。因此,我在删除任何下拉列记录时遇到问题。
删除记录时,我会显示一个消息框以接受用户的确认。在该消息框中,我想显示我要删除的下拉列表的选定文本值。但是,不是显示文本值,而是显示我选择的值(GUID),如下所示:
但我想显示该下拉菜单的选定文字。为了使编码视角更加清晰,我粘贴了我的jQgrid代码
function RenderPOFieldsGrid() {
if (g_bEditMode) {
var oGrid = $('#tbPOFields'), topPagerSelector = '#' + $.jgrid.jqID(oGrid[0].id) + "_toppager", lastSel;
oGrid.jqGrid({
url: sRelativePath + '/WSAjax.asmx/GetDataForGridInEdit',
mtype: "POST",
datatype: "json",
ajaxGridOptions: { contentType: "application/json; charset=utf-8" },
serializeGridData: function (data) {
return JSON.stringify(data);
},
jsonReader: {
root: "d.rows",
page: "d.page",
total: "d.total",
records: "d.records"
},
colNames: ['ConsigneeId', 'Consignee'],
colModel: [
{ name: 'ConsigneeId', index: 'ConsigneeId', hidden: true },
{ name: 'Consignee', index: 'Consignee', sortable: false, title: false, width: 42, editable: true, edittype: 'select', formatter: 'select',
editrules: {
required: true,
custom: true,
custom_func: function (value, colName) {
if ($('#tbItems_Consignee').length === 1) {
var selrow = $('#tbItems').jqGrid('getGridParam', 'selrow');
$('#tbItems').jqGrid('setCell', selrow, 'ConsigneeId', value);
}
if (g_bEditMode && value === g_sValueNONE && !g_bIsOrderType_Maintenance)
return [false, " is an invalid Consignee.<br/>Please select a valid Consignee before saving."];
else {
return [true, ""];
}
}
},
editoptions:
{
value: eval('(' + g_oConsigneeList + ')'),
dataEvents: [
{ type: 'keyup', fn: function (e) { $(e.target).trigger('change'); } },
{
type: 'change',
fn: function (e) {
if (!e.isTrigger) {
var selrow = $('#tbItems').jqGrid('getGridParam', 'selrow');
var ConsigneeId = $(this).val();
$('#tbItems').jqGrid('setCell', selrow, 'ConsigneeId', ConsigneeId);
}
}
}]
}
}
],
prmNames: { page: "pageIndex", rows: "pageSize", sort: "sortIndex", order: "sortDirection" },
autowidth: true,
postData: {
filters: null,
spName: 'GetPOFieldsDetailsList',
paramXML: ''
},
width: 'auto',
height: 'auto',
rowNum: 1000,
rowList: [1000],
sortname: "",
sortorder: "asc",
page: 1,
gridview: true,
toppager: true,
autoencode: true,
ignoreCase: true,
viewrecords: true,
caption: 'Fields',
editurl: 'clientArray',
emptyrecords: "No records to view.",
footerrow: true,
onSelectRow: function (rowid) {
if (rowid && rowid != lastSel) {
if (typeof lastSel !== "undefined") {
$(this).jqGrid('restoreRow', lastSel);
}
lastSel = rowid;
}
}
});
oGrid.jqGrid('navGrid', topPagerSelector, { add: false, edit: false, search: false, refresh: false }, {}, {}, myDelParams, {});
oGrid.jqGrid('inlineNav', topPagerSelector, {
addParams: myFieldAddParams
editParams: myFieldsEditParams
});
}
}
var myDelParams = {
processing: true,
// because I use "local" data I don't want to send the changes
// to the server so I use "processing:true" setting and delete
// the row manually in onclickSubmit
onclickSubmit: function (options, rowid) {
var gridId = $.jgrid.jqID($(this)[0].id);
// reset the value of processing option which could be modified
options.processing = true;
DeleteExpenseDetails(rowid);
$.jgrid.hideModal("#delmod" + gridId,
{ gb: "#gbox_" + gridId,
jqm: options.jqModal, onClose: options.onClose
});
return true;
},
beforeShowForm: function ($form) {
var rowId = $(this).jqGrid('getGridParam', 'selrow');
$("td.delmsg", $form[0]).html("Do you really want delete the <b> Consignee: " + $(this).jqGrid('getCell', rowId, 'Consignee') + "</b>?");
},
afterShowForm: function ($form) {
var dialog = $form.closest('div.ui-jqdialog'),
selRowId = $(this).jqGrid('getGridParam', 'selrow'),
selRowCoordinates = $('#' + selRowId).offset();
dialog.offset(selRowCoordinates);
dialog.css('width', 'auto');
}
};
答案 0 :(得分:1)
很难重现您的问题,因为没有包含测试数据的工作演示。
我认为您在没有formatter: 'select'
的代码之前使用过,现在您已将该属性添加到列Consignee
。此外,您将用作jqGrid输入的数据从textes更改为值(ids)。因此,您现在获得$(this).jqGrid('getCell', rowId, 'Consignee')
值而不是删除对话框中的文本。从免费的jqGrid 4.8.2到4.9.2的迁移似乎与我的问题无关。
在我更改您在“删除”表单中使用的beforeShowForm
代码时,问题的解决方案就出现了。从列Consignee
获取值后(使用$(this).jqGrid('getCell', rowId, 'Consignee')
),您必须使用列的editoptions.value
属性将值转换为文本。您目前只在代码中使用value: eval('(' + g_oConsigneeList + ')')
。因此,我不清楚您使用哪种格式的数据value
。无论如何,value: $.parseJSON('(' + g_oConsigneeList + ')')
的使用似乎更好,以减少安全问题。要将值转换为需要解析editoptions.value
属性的文本。 jqGrid允许您使用value
的不同形式。例如,如果您使用对象表单,则可以使用以下代码
beforeShowForm: function ($form) {
var $self = $(this), p = $self.jqGrid("getGridParam"),
val = $self.jqGrid("getCell", p.selrow, "Consignee"),
cm = p.colModel[p.iColByName.Consignee],
editVal = cm.editoptions.value;
$("td.delmsg", $form[0]).html("Do you really want delete the <b> Consignee: " +
editVal[val] + "</b>?");
}
如果使用editoptions.value
属性的字符串形式,则应将值editVal[val]
替换为更复杂的代码。您需要先将editoptions.value
除以;
,然后将每个结果元素按:
拆分,以便为文本映射赋值。然后,您需要找到与该值对应的文本。
UPDATED :以与jqGrid显示的格式完全相同的方式从单元格获取数据的方法如下:
beforeShowForm: function ($form) {
var $self = $(this), p = $self.jqGrid("getGridParam"),
tr = $self.jqGrid("getGridRowById", p.selrow),
$cell = $.jgrid.getDataFieldOfCell.call(this, tr, p.iColByName.Consignee);
$("td.delmsg", $form[0]).html("Do you really want delete the <b> Consignee: " +
$cell.text() + "</b>?");
}
如果使用了某个包装器,辅助方法$.jgrid.getDataFieldOfCell
会将<td>
元素或单元格的内部部分传递给我们。然后,一个校准使用$cell.text()
来获取所需的数据。