Я использую Datatables , чтобы улучшить функциональность на стороне клиента для моего ASP.NET Gridview. Все работает отлично. Этот конкретный вид сетки всегда находится в «режиме редактирования» или представляет собой набор текстовых полей, а не значений строк.
У меня так на Postback (что можно сделать, только нажав кнопку Сохранить - все остальное делается на стороне клиента), я сохраняю все записи, которые были помечены как измененные. Записи помечаются как измененные событием OnTextChanged Textbox, которое происходит при обратной передаче.
Вот проблема и пример: если я изменяю значение на странице 1, перехожу на страницу 2, а затем нажимаю кнопку Сохранить ... OnTextChanged, кажется, вызывается только для текстовых полей на странице 2, поэтому измененное значение на странице 1 не сохраняется Как я могу убедиться, что значения, измененные на всех страницах, сохраняются при окончательном нажатии кнопки?
EDIT:
Я действительно хочу, чтобы это работало. Вот полный раздел моего Javascript с дополнениями Юрия.
<script type="text/javascript">
/* Create an array with the values of all the input boxes in a column */
$.fn.dataTableExt.afnSortData['dom-text'] = function (oSettings, iColumn) {
var aData = [];
$('td:eq(' + iColumn + ') input', oSettings.oApi._fnGetTrNodes(oSettings)).each(function () {
aData.push(this.value);
});
return aData;
}
/* Make datatables send all rows to the server for saving */
$.fn.dataTableExt.fnGetHiddenNodes = function (oSettings) {
var anNodes = this.oApi._fnGetTrNodes(oSettings);
var anDisplay = $('tbody tr', oSettings.nTable);
for (var i = 0; i < anDisplay.length; i++) {
var iIndex = jQuery.inArray(anDisplay[i], anNodes);
if (iIndex != -1) {
anNodes.splice(iIndex, -1);
}
}
return anNodes;
}
$(document).ready(function () {
setTimeout(function () {
$(document).ready(function () {
$("#containers_gv").dataTable({
"bJQueryUI": true,
"bSortClasses": false,
"sPaginationType": "full_numbers",
"sDom": '<"#top"fl>rt<"#bottom"ip><"clear">',
"aoColumns": [
null,
{ "sSortDataType": "dom-checkbox" },
{ "sSortDataType": "dom-text" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text" },
{ "sSortDataType": "dom-checkbox" },
{ "sSortDataType": "dom-text" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric" },
{ "sSortDataType": "dom-text", "sType": "numeric"}]
});
$('#bottom').appendTo('#gv_controls');
$('#top').appendTo('#gv_topcontrols');
}), 1000
});
$(function () {
$("#containers_gv").prepend($("<thead></thead>").append($(this).find("tr:first"))).dataTable();
});
});
function doSave() {
var grid = $("#containers_gv");
var hiddenRows = grid.dataTable().fnGetHiddenNodes();
$.each(hiddenRows, function () { $(this).css("display", "none").appendTo(grid); });
return true;
}
</script>