Мне нужно загрузить JSON с сервера, и я хочу, чтобы пользователь мог щелкнуть и отредактировать значение.
Но когда они редактируют, он не должен вызывать сервер. Я имею в виду, что я не собираюсь обновляться немедленно. Так что я не хочу editurl. Так что я попробовал 'ClientArray' Но все же он показывает, что Url не установлен в поле предупреждения. Но мне нужно все отредактированные значения, когда пользователь нажимает кнопку "Добавить комментарии" , эта кнопка загорается AddSelectedItemsToSummary(), чтобы сохранить их на сервере
MVC HTML Script
<div>
<table id="persons-summary-grid"></table>
<input type="hidden" id="hdn-deptsk" value="2"/>
<button id="AddSelectedItems" onclick="AddSelectedItemsToSummary();" />
</div>
$(document).ready(function(){
showSummaryGrid(); //When the page loads it loads the persons for Dept
});
Данные JSON
{"total":2,"page":1,"records":2,
"rows":[{"PersonSK":1,"Type":"Contract","Attribute":"Organization
Activity","Comment":"Good and helping og"},
{"PersonSK":2,"Type":"Permanant","Attribute":"Team Management",
"Comment":"Need to improve leadership skill"}
]}
Код jQGRID
var localSummaryArray;
function showSummaryGrid(){
var summaryGrid = $("#persons-summary-grid");
// doing this because it is not firing second time using .trigger('reloadGrid')
summaryGrid.jqGrid('GridUnload');
var deptSk = $('#hdn-deptsk').val();
summaryGrid.jqGrid({
url: '/dept/GetPersonSummary',
datatype: "json",
mtype: "POST",
postData: { deptSK: deptSk },
colNames: [
'SK', 'Type', 'Field Name', 'Comments'],
colModel: [
{ name: 'PersonSK', index: 'PersonSK', hidden: true },
{ name: 'Type', index: 'Type', width: 100 },
{ name: 'Attribute', index: 'Attribute', width: 150 },
{ name: 'Comment', index: 'Comment', editable: true,
edittype: 'textarea', width: 200 }
],
cellEdit: true,
cellsubmit: 'clientArray',
editurl: 'clientArray',
rowNum: 1000,
rowList: [],
pgbuttons: false,
pgtext: null,
viewrecords: false,
emptyrecords: "No records to view",
gridview: true,
caption: 'dept person Summary',
height: '250',
jsonReader: {
repeatitems: false
},
loadComplete: function (data) {
localSummaryArray= data;
summaryGrid.setGridParam({ datatype: 'local' });
summaryGrid.setGridParam({ data: localSummaryArray});
}
});
)
Функция нажатия кнопки
function AddSelectedItemsToSummary() {
//get all the items that has comments
//entered using cell edit and save only those.
// I need to prepare the array of items and send it to MVC controller method
// Also need to reload summary grid
}
Может ли кто-нибудь помочь в этом? почему я получаю этот URL-адрес не установленной ошибкой?
EDIT:
Этот код работает после loadComplete изменений. Прежде чем он показывал Предупреждение о настройке URL
Я не понимаю проблему редактирования ячейки, которую вы описываете. Кроме того, вы написали "Мне нужно отредактированное значение, когда пользователь нажимает + значок в строке". Где значок "+"? Вы имеете в виду значок "trash.gif" ? Если вы хотите использовать редактирование ячеек, как вы это себе представляете при нажатии на значок в строке? Какую ячейку следует начать редактировать при нажатии на значок "trash.gif" ? Вы можете начать редактирование какой-либо другой ячейки, поскольку ячейка с иконкой "trash.gif" is editCell, но я не думаю, что она быть удобным для пользователя, потому что для пользователей точки зрения он начнет редактирование одной ячейки при нажатии другой ячейки. Мне кажется, мне неудобно. Возможно, вы хотите реализовать встроенное редактирование?
Одна явная ошибка в вашем коде - использование showSummaryGrid
внутри RemoveFromSummary
. Функция RemoveFromSummary
создает jqGrid, а не просто заполняет ее. Поэтому его следует называть только один раз. Чтобы обновить тело сетки, вы должны вызвать $("#persons-summary-grid").trigger("refreshGrid");
. Вместо использования postData: { deptSK: deptSk }
вы должны использовать
postData: { deptSK: function () { return $('#hdn-deptsk').val(); } }
В случае, если запуск refreshGrid будет достаточно, и он отправит серверу текущее значение из '#hdn-deptsk'
. Подробнее см. .
ОБНОВЛЕНО. Я не смог воспроизвести проблему, которую вы описали, но я подготовил демо, которые делают что вам нужно (если я правильно понимаю ваши требования). Самая важная часть кода, который вам, вероятно, вам нужен, находится ниже
$("#AddSelectedItems").click(function () {
var savedRow = summaryGrid.jqGrid("getGridParam", "savedRow"),
$editedRows,
modifications = [];
if (savedRow && savedRow.length > 0) {
// save currently editing row if any exist
summaryGrid.jqGrid("saveCell", savedRow[0].id, savedRow[0].ic);
}
// now we find all rows where cells are edited
summaryGrid.find("tr.jqgrow:has(td.dirty-cell)").each(function () {
var id = this.id;
modifications.push({
PersonSK: id,
Comment: $(summaryGrid[0].rows[id].cells[2]).text() // 2 - column name of the column "Comment"
});
});
// here you can send modifications per ajax to the server and call
// reloadGrid inside of success callback of the ajax call
// we simulate it by usage alert
alert(JSON.stringify(modifications));
summaryGrid.jqGrid("setGridParam", {datatype: "json"}).trigger("reloadGrid");
});