【发布时间】:2018-06-14 07:24:21
【问题描述】:
我正在使用 jQgrid Free (release 4.15.2),我需要添加内联编辑行的功能,这根本不是问题,因为它很容易设置。这是我正在使用的代码:
$.jgrid = $.jgrid || {};
$.jgrid.no_legacy_api = true;
$.jgrid.useJSON = true;
$(function () {
"use strict";
var $grid = $("#list"),
pagerSelector = "#pager",
customAddButton = function (options) {
$grid.jqGrid('navButtonAdd', pagerSelector, options);
$grid.jqGrid('navButtonAdd', '#' + $grid[0].id + "_toppager", options);
};
$.fn.fmatter.customActionsFormatter = function (cellValue, options, rowData) {
return '<a href="#" title="Delete selected row"><span class="fa fa-fw fa-trash-o delete_row" data-id="' + rowData.Id + '"></span></a>';
};
$grid.jqGrid({
url: '/ajax/plans_to_forms/get_all',
datatype: "json",
colNames: ["", "Id", "Form #", "Form", "Plan", "Class", "Drug"],
colModel: [
{name: "act", formatter: "customActionsFormatter", width: 20, search: false},
{name: "Id", jsonmap: "Id", key: true, hidden: true},
{name: "FormId", align: 'center', fixed: true, frozen: true, resizable: false, width: 100},
{name: "FormName", width: 300},
{name: "PlanName", width: 300},
{name: "DrugGroupName", width: 300},
{name: "DrugName", width: 300}
],
cmTemplate: {autoResizable: true, editable: true},
iconSet: "fontAwesome",
rowNum: 25,
guiStyle: "bootstrap",
autoResizing: {compact: true},
rowList: [25, 50, 100, "10000:All"],
viewrecords: true,
autoencode: true,
sortable: true,
pager: pagerSelector,
toppager: true,
cloneToTop: true,
hoverrows: true,
multiselect: true,
multiPageSelection: true,
rownumbers: true,
sortname: "Id",
sortorder: "desc",
loadonce: true,
autowidth: true,
autoresizeOnLoad: true,
forceClientSorting: true,
shrinkToFit: true,
navOptions: {
edit: false,
add: false,
del: false,
search: false
},
inlineEditing: {keys: true, defaultFocusField: "DrugGroupName", focusField: "DrugGroupName"},
onSelectRow: function (rowid, status, e) {
var $self = $(this), savedRow = $self.jqGrid("getGridParam", "savedRow");
if (savedRow.length > 0 && savedRow[0].id !== rowid) {
$self.jqGrid("restoreRow", savedRow[0].id);
}
$self.jqGrid("editRow", rowid, {focusField: e.target});
}
}).jqGrid('navGrid', pagerSelector, {
search: false,
edit: false,
add: false,
del: false,
refresh: true,
cloneToTop: true
}).jqGrid("filterToolbar", {
stringResult: true, searchOnEnter: false, defaultSearch: 'cn'
}).jqGrid("gridResize").jqGrid('setFrozenColumns');
customAddButton({
caption: 'Delete selected',
buttonicon: 'fa-trash-o',
title: "Delete all selected rows",
onClickButton: function () {
var rowIds = $("#list").jqGrid('getGridParam', 'selarrrow');
if (rowIds.length > 0) {
delete_all_link_modal.modal();
delete_all_link_modal.attr('data-link-ids', rowIds);
} else {
alert('You must select at least one item.');
}
}
});
});
以下行启用内联编辑:
inlineEditing: {keys: true, defaultFocusField: "DrugGroupName", focusField: "DrugGroupName"}
我的问题在哪里?我只需要编辑DrugGroupName 列,上面的行使整行可编辑,这导致我提出以下问题:
是否可以只编辑一组给定的列而不是全部? - 我正在检查文档here,但找不到任何有用的东西是否可以在我单击任何其他位置或按 ENTER 键时立即将数据发送到服务器? - 我想避免额外点击保存图标。
更新:我已经找到了第一个问题的答案。我只需要在定义colModel 时使该列不可编辑。例如:
colModel: [
{name: "act", formatter: "customActionsFormatter", width: 20, search: false},
{name: "Id", jsonmap: "Id", key: true, hidden: true},
{name: "FormId", align: 'center', fixed: true, frozen: true, resizable: false, width: 100, editable: false},
{name: "FormName", width: 300, editable: false},
{name: "PlanName", width: 300, editable: false},
{
name: "DrugGroupName",
width: 300,
edittype: "select",
editoptions: {
generateValue: true,
selectFilled: function (options) {
setTimeout(function () {
$(options.elem).select2({
width: "100%"
});
}, 0);
}
},
stype: "select", searchoptions: {
sopt: ["eq", "ne"],
generateValue: true,
noFilterText: "Any",
selectFilled: function (options) {
$(options.elem).select2({
width: "100%"
});
}
}
},
{name: "DrugName", width: 300, editable: false}
]
这样我就强制 DrugGroupName 成为唯一可编辑的。
【问题讨论】:
-
免费 jqGrid 允许将
editable不仅用作布尔值,还可以用作"hidden"、"disabled"、"readonly"或回调函数。您可以在例如"FormId"列中使用editable: "hidden"来发送列中的数据,但不能编辑"FormId"列中的数据。此外,您可以删除不需要的{name: "Id", jsonmap: "Id", key: true, hidden: true}列并添加prmNames: { id: "Id" }。它修复了填充网格和编辑:内联编辑将在编辑期间发送Id属性而不是id。 -
我可以稍后再做。你能用一些简单的测试数据准备 jsfiddle 演示,你的代码?您可以使用 jsfiddle 的 Echo 服务来模拟从服务器加载数据。您究竟想将哪些数据发送到服务器?来自编辑行的其他列或其他动态值?我在您的网格中没有看到任何
editurl参数,这很奇怪。您希望 jqGrid 将编辑数据发送到服务器,但您必须指定数据应发送到的 URL (editurl)。您可以在演示中使用 Echo 服务 (editurl: "/echo/json/") 在 DevTools 中进行测试。 -
@Oleg 我不太擅长 JSFiddle,但我为您准备了一个“演示”here。我没有添加远程支持,因为我不知道该怎么做,并且由于某种原因,Bootstrap 模态与 UX 搞混了,不知道为什么。我刚刚发现
editurl,所以我已将其添加到演示中,如果您需要我提供其他任何内容,请告诉我。 -
您在实际项目中使用哪个版本的 Bootstrap、jQuery 和 jQuery UI?你使用 jQuery UI 还是只使用 Bootstrap?另外我不明白
customActionsFormatter的目标。你能解释一下你试图用它来实现什么吗?为什么不使用标准的formatter: "actions"?
标签: javascript jquery jqgrid free-jqgrid