Barra de herramientas para buscar datos locales, retener el valor en la celda incluso después de buscar

Estoy usando la barra de herramientas para buscar datos locales (porque estoy usando la opción loadonce: true ). En mi cuadrícula, hay una columna ‘Transferir cantidad’. que es por defecto editable. introduzca la descripción de la imagen aquí

Quiero una funcionalidad como, supongo que ingresé algún valor en la columna ‘Cantidad de transferencia’. en la 4ta fila cuyo nombre de No. de lote es ‘OpStk_Leher_Mumbai-500’ (para eso consulte la imagen de arriba) y si hago una búsqueda con la cadena de búsqueda ‘P-35’ y presiono enter, aparece la primera fila de tres como resultado según mi cadena de búsqueda y excluirá la 4ª fila en la que ingresé un valor. Para tener una idea por favor refiérase a la siguiente imagen … introduzca la descripción de la imagen aquí

Pero si quito la cadena de búsqueda del cuadro de búsqueda y presiono Intro, me da todos los registros, pero el valor que ingresé en la 4ª fila en la columna ‘TransferQty’ desaparece y quiero conservar ese valor de todos modos.

Si alguien sabe cómo hacerlo, por favor comparta sus valiosas ideas.

Para obtener comprensión según la perspectiva técnica, mi código jQgrid es el siguiente:

  var oGrid = $('#tbLots'), topPagerSelector = '#' + $.jgrid.jqID(oGrid[0].id) + "_toppager", lastSel; oGrid.jqGrid({ url: sRelativePath + '/WSAjax.asmx/GetDataForGrid', 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: ['SISDIdForExch', 'SubLotId', 'Lot#', 'Expiry Date', 'Qty.', 'Transfer Qty.'], colModel: [ { name: 'SISDIdForExch', index: 'SISDIdForExch', hidden: true }, { name: 'SubLotId', index: 'SubLotId', hidden: true }, { name: 'LotNo', index: 'LotNo', editable: false, sortable: false, width: 100}, {name: 'Expiry', index: 'Expiry', editable: false, search: false, align: 'center', formatter: 'date', formatoptions: { srcformat: 'm/d/Y', newformat: 'd/m/Y' }, sortable: false, width: 60 }, { name: 'BucketQty', index: 'BucketQty', editable: false, search: false, template: viewNumTemplate, width: 60 }, { name: 'TransferQty', index: 'TransferQty', editable: true, search: false, template: editNumTemplate, width: 60, editrules: { minValue: 0.00 }, editoptions: { dataInit: function (domElem) { $(domElem).on("blur", function () { calculateTotalTransferQty($("#tbLots")); }); } } } ], prmNames: { page: "pageIndex", rows: "pageSize", sort: "sortIndex", order: "sortDirection", search: "_search" }, search: false, postData: { filters: null, spName: 'GetLotDetails', paramXML: $xmlDoc.html().toString() }, width: 'auto', height: 'auto', rowNum: 1000, sortname: '', sortorder: 'asc', page: 1, gridview: true, toppager: true, autoencode: true, ignoreCase: true, viewrecords: true, caption: 'Item Lots', editurl: 'clientArray', footerrow: true, loadonce: true, gridComplete: function () { $("table#tbLots tr:last").addClass('ireg-jqgrid-lastrow'); $("tr.footrow td").addClass('ireg-jqgrid-lastrow').addClass('ireg-jqgrid-footer'); }, loadComplete: function (data) { updateJqGridButtonState($(this), jqGridMode.None); //Following piece of code made 'Transfer Qty.' column by default editable. var l_oIds = oGrid.jqGrid('getDataIDs'), i; for (i = 0; i  0) $('#' + l_oIds[0] + '_TransferQty').get(0).focus(); }, onSelectRow: function (rowid) { if (rowid && rowid != lastSel) { if (typeof lastSel !== "undefined") { $(this).jqGrid('restreRow', lastSel); } lastSel = rowid; } updateJqGridButtonState($(this), jqGridMode.None); } }); oGrid.jqGrid('filterToolbar', { stringResult: true, defaultSearch: 'cn', //groupOp: 'OR', beforeSearch: function () { if (colDataTypes.length != 0 && colDataTypes != undefined) { var oRules = new Array(); var postdata = $('#tbLots').jqGrid('getGridParam', 'postData'), oCustFilter = $.parseJSON(postdata.filters), colName, searchStr, operator, groupOperator = ''; for (var i = 0; i < oCustFilter.rules.length; i++) { groupOperator = oCustFilter.groupOp; searchStr = oCustFilter.rules[i].data; colName = oCustFilter.rules[i].field; operator = oCustFilter.rules[i].op; oRules.push({ field: colName, op: operator, data: searchStr }); } if (searchVal != null && searchVal != '') { var oFilter = { groupOp: groupOperator, rules: oRules }; $.extend(postdata, { filters: JSON.stringify(oFilter) }); $('#tbLots').jqGrid('setGridParam', { search: true, postData: postdata }); $('#tbLots').trigger("reloadGrid", [{ page: 1}]); } } return true; } }); //Added afterRefresh function to clear toolbar. oGrid.jqGrid('navGrid', topPagerSelector, { add: false, edit: false, del: false, search: false, afterRefresh: function () { $(this)[0].clearToolbar(); } }, {}, {}, {}, {}); 

Aquí está mi código actualizado, la forma en que me enseñaste a hacer

 oGrid.jqGrid('filterToolbar', { stringResult: true, defaultSearch: 'cn', //groupOp: 'OR', beforeSearch: function () { if (colDataTypes.length != 0 && colDataTypes != undefined) { var oRules = new Array(); var postdata = $('#tbLots').jqGrid('getGridParam', 'postData'), oCustFilter = $.parseJSON(postdata.filters), colName, searchStr, operator, groupOperator = ''; for (var i = 0; i < oCustFilter.rules.length; i++) { groupOperator = oCustFilter.groupOp; searchStr = oCustFilter.rules[i].data; colName = oCustFilter.rules[i].field; operator = oCustFilter.rules[i].op; //iReg-1821: Uncommneted the following code. var colIndex = getColumnIndexByName($('#tbLots'), colName); var searchVal = '', bAttachQuote = false; if ('STRING' === colDataTypes[colIndex]) { searchVal = searchStr; bAttachQuote = true; } oRules.push({ field: colName, op: operator, data: searchStr, coldatatype: colDataTypes[colIndex], attachquote: bAttachQuote }); } if (searchVal != null && searchVal != '') { var oFilter = { groupOp: groupOperator, rules: oRules }; $.extend(postdata, { filters: JSON.stringify(oFilter) }); $('#tbLots').jqGrid('setGridParam', { search: true, postData: postdata }); $('#tbLots').trigger("reloadGrid", [{ page: 1}]); } } HERE IS MY CODE, WHAT YOU TAUGHT ME TO DO var l_oIds = oGrid.jqGrid('getDataIDs'), i; for (i = 0; i < l_oIds.length; i++) { oGrid.jqGrid('saveRow', l_oIds[i], false, 'clientArray'); } return true; } }); 

El origen del problema me parece utilizar el comportamiento que describió como

… una columna ‘Transfer Qty’ que es por defecto editable.

Se llama editRow para todas las filas de la cuadrícula. Así que establece todas las filas de la cuadrícula en estado de edición . No es una forma recomendada porque crea más problemas.

El problema es el siguiente. Si comienza la edición en línea, jqGrid guarda los valores originales de todas las filas de edición dentro del parámetro savedRow de la savedRow interna, que es una matriz de valores originales de todas las filas de edición. Durante la edición en línea, el usuario puede realizar algunos cambios en cualquiera de los campos editables, pero el usuario puede cancelar los cambios presionando la tecla Esc . En otras palabras, jqGrid tiene que mantener los valores antiguos y los valores modificados actuales (aún no guardados). Si el usuario hace clic en el encabezado de la columna, jqGrid ordena por columna de forma predeterminada. Ordenar significa volver a llenar la página actual de la cuadrícula . No está claro si las filas editables actuales deben guardarse o descartarse. Por lo tanto, la clasificación suele estar prohibida durante la edición en línea. El mismo problema existe con la búsqueda.

Si desea permitir la búsqueda durante la edición en línea y si necesita guardar los datos, debe llamar a saveRow en el bucle dentro de la callback de filterToolbar de filterToolbar . Exactamente como editRow explícitamente a editRow para todas las filas dentro de loadComplete debes llamar a saveRow para todas las filas dentro de beforeSearch antes del desencadenamiento de reloadGrid .

Un comentario más a tu código. Me parece que la última fila de la cuadrícula tiene un significado especial: contiene la información del pie de página. Establece la ireg-jqgrid-lastrow en la fila dentro de gridComplete . La fila no será editable. Tal escenario me parece que podría implementarse de otra manera en jqGrid. Puede agregar la opción footerrow: true en la cuadrícula. Agregue un div separado debajo de la cuadrícula principal, pero todo se ve muy cerca de la imagen que incluyó. La principal diferencia existe en la separación de los datos principales del pie de página. Puede usar el método footerData para obtener los datos en el pie de página o puede usar la opción userDataOnFooter: true . jqGrid será el pie de página automáticamente con los datos de la parte de datos de userdata de los datos devueltos desde el servidor. Vea la respuesta anterior y esta o esta para obtener las demostraciones correspondientes y los detalles de la implementación.

SOLUCIÓN: – He implementado loadonce: true

 oGrid.jqGrid('filterToolbar', { stringResult: true, defaultSearch: 'cn', //groupOp: 'OR', beforeSearch: function () { var oRules = new Array(); var postdata = $('#tbLots').jqGrid('getGridParam', 'postData'), oCustFilter = $.parseJSON(postdata.filters), colName, searchStr, operator, groupOperator = ''; for (var i = 0; i < oCustFilter.rules.length; i++) { groupOperator = oCustFilter.groupOp; searchStr = oCustFilter.rules[i].data; colName = oCustFilter.rules[i].field; operator = oCustFilter.rules[i].op; oRules.push({ field: colName, op: operator, data: searchStr }); } var oFilter = { groupOp: groupOperator, rules: oRules }; $.extend(postdata, { filters: JSON.stringify(oFilter) }); $('#tbLots').jqGrid('setGridParam', { search: true, postData: postdata }); //$('#tbLots').trigger("reloadGrid", [{ page: 1}]); } /*here is the code, what you taught me to do*/ var l_oIds = oGrid.jqGrid('getDataIDs'), i; for (i = 0; i < l_oIds.length; i++) { oGrid.jqGrid('saveRow', l_oIds[i], false, 'clientArray'); } //reloading grid after saverow $('#tbLots').trigger("reloadGrid", [{ page: 1}]); return true; });