Todo lo que desea tener en la parte 1 de su pregunta se puede implementar con jqGrid 3.7.x. Debe usar los parámetros datatype: 'json'
y loadonce: true
. El servidor debe enviar todos los datos. Ver jqgrid setGridParam datatype:local como ejemplo.
¿Qué pasa con la segunda parte de su pregunta? Me parece que tratas de hacer que jqGrid sea demasiado complejo. Me resulta mucho más fácil establecer algunos controles (seleccionar/cuadros desplegables, casillas de verificación o botones de opción) fuera de de jqGrid (por ejemplo, en la parte superior de la cuadrícula). Si el usuario realiza cambios en algunos de estos controles, debe volver a cargar la cuadrícula del servidor según los nuevos parámetros elegidos. Ver How to filter the jqGrid data NOT using the built in search/filter box como ejemplo. Si intenta combinar de esta manera con el parámetro loadonce: true
, debe subestimar, que después de la primera carga de la grilla con loadonce: true
el otro parámetro datatype: 'json'
se cambiará a datatype: 'local'
. Por lo tanto, para volver a cargar la cuadrícula, debe establecer datatype: 'json'
cada vez antes de volver a cargar la cuadrícula.
ACTUALIZADO basado en comentarios: Bueno.Si tiene algunos conjuntos de datos predefinidos, quiere cargarlos todos del servidor y luego visualizar rápidamente la cuadrícula necesaria, puede definir algunas inmersiones y colocar todas las jqGrids (elementos div de tabla y paginación) dentro del div adicional correspondiente (un div por jqGrid) . Puede comenzar a cargar los datos a todas estas cuadrículas en la carga de la página. Usted hace que los padres div sean invisibles u ocultos con respecto a jQuery.show()
y jQuery.hide()
en cualquier momento que lo necesite. Las Divs que deberían estar ocultas al inicio de la página pueden tener el estilo CSS display:none
.
Otra opción para crear cuadrículas dinamicamente con datos en caché es la siguiente. Puede eliminar un jqGrid con jQuery.remove()
e insertar uno nuevo <table>
y un elemento de búsqueda <div>
con un método como jQuery.after()
. De esta forma puedes construir jqGrid absolutamente de manera dinámica. Si lo hace, debe tener en cuenta que jqGrid crea algunos div adicionales sobre la tabla y los elementos div de paginación. Entonces para eliminar jqGrid completo con id = "list" deberías eliminar div con id = "gbox_list". Alternativa si coloca <table>
y busca <div>
en un elemento div primario y puede usar los métodos jQuery.empty()
y jQuery.html()
en el div principal para eliminar o insertar uno nuevo jqGrid.
Ahora sobre la visualización de botones de opción dentro de jqGrid. Esto es posible si usará el formateador personalizado. Consulte jqGrid: Editable column that always shows a select como ejemplo de cómo mostrar seleccionados (cuadros desplegables) dentro de jqGrid. Por cierto, no veo ninguna ventaja para usar botones de radio en comparación con selects. Los botones de radio ocupan solo un lugar más en la página y los usuarios tendrán que desplazarse por la página de forma ficticia.
Sin embargo, no le recomiendo que use elementos complejos dentro de las celdas jqGrid. Te recomiendo que demuestres a tus usuarios la función "Edición en línea" de jqGrid. Significa que si el usuario selecciona una fila o hace doble clic en una fila (puede implementar de una manera que prefiera a sus usuarios) la fila se cambiará en el modo de edición con casillas de verificación, cuadros de selección (cuadros desplegables), entradas de texto, etc. . Esta es una forma estándar. Tiene algunas ventajas sobre la "edición de forma" desde el lado de la comodidad del usuario. Cuanto más se aleje de la norma , más problemas puede recibir en el futuro. Para mostrar "edición en línea", puede abrir http://trirand.com/blog/jqgrid/jqgrid.html y elegir en el árbol a la izquierda "Edición de filas" y luego "Tipos de entrada". Como ejemplo de código, puede usar jqGrid - edit only certain rows for an editable column.
ACTUALIZADO 2: Una pequeña observación más. Si los datos en el servidor no se cambiarán de forma explícita y usted desea más tiempo de caché en el cliente, puede considerar usar el parámetro prmNames: { nd:null}
de jqGrid, especialmente si usa Internet Explorer. Si hace esto, los últimos resultados HTTP GET (solicitudes incluidas jQuery.ajax
) se almacenarán en caché en el cliente y las próximas rwquests ajax pueden cargar datos desde el caché local del navegador en lugar de enviar solicitudes al servidor. Si el servidor incluye información sobre el tiempo de caché permitido en la respuesta (encabezados HTTP), se usará automáticamente en el cliente en jQuery.ajax
.
ACTUALIZADO 3 según el código fuente publicado: Tiene algunos errores en el código. Aquí está el código fijo
var myGrid = $("#mygrid").jqGrid({
datatype: 'local',
colModel: [
{ name: 'AID', label: 'Some ID', key: true, width: 100,
editable: false, sorttype: "int" },
{ name: 'Name', width: 300, editable: false },
{ name: 'Group', width: 100, editable: false },
{ name: 'Info', width: 100, editable: false },
{ name: 'AValue', width: 100, editable: true, edittype: 'text' }
],
pager: '#mypager',
rowNum: 10,
rowList: [10, 20, 500],
viewrecords: true,
autowidth: true,
sortname: 'AID',
sortorder: 'desc'
});
myGrid.jqGrid('navGrid','#mypager',{edit:false,add:false,del:false,search:false});
var mydata = [];
for (var i = 0; i < 100; i++) {
mydata.push({AID:i,Name:"123",Group:"456",Info:"78",AValue:"8"});
}
myGrid.setGridParam({data: mydata}).trigger("reloadGrid");
Puede probar aquí http://www.ok-soft-gmbh.com/jqGrid/Clientside.htm
ACTUALIZADO 4: El mismo ejemplo, inclusive, la edición de lado del cliente está aquí http://www.ok-soft-gmbh.com/jqGrid/ClientsideEditing.htm. Se basa en http://www.trirand.com/blog/?page_id=393/help/losing-edited-cell-data-after-paging/ y Losing edited cell data after paging.
Gracias Oleg. Los ejemplos que he visto toman datos pasados del servidor y page/sort/etc. No hay problema. Sin embargo, me gustaría tomar datos del servidor y almacenarlos en una variable de "caché" separada en el cliente. Luego deseo llenar varias cuadrículas en la página, p. Grid1 tiene todas las filas de caché donde cacheRow.Array.Type = 1, Grid2 tiene "Tipo = 2" filas, etc. Realmente quiero tener un control completo, del lado del cliente, sobre la adición y eliminación de datos de cada grid. Parece que las cuadrículas no "página" correctamente cuando hago esto - cada cuadrícula muestra todas sus filas! Debe estar perdiendo algo simple, creo. – jqwha
No creo haber explicado muy bien la segunda parte. Digamos que el conjunto de datos es [{ID: 1, Nombre: 'Bob', Género: 'Hombre'}, {ID: 1, Nombre: 'Hilary', Sexo: 'Mujer'}, ...] Mi los usuarios quieren ver esto con una columna debajo de "Género" que tiene dos botones de opción en cada celda, 'Hombre' y 'Mujer'. Luego pueden simplemente mirar la lista, hacer clic en la radio correcta y luego guardar los datos. Mis problemas son: 1) cómo obtener los botones de opción en cada celda. Los usuarios no desean hacer clic en "editar" en cada fila y quisieran ver los datos como radios. 2) vinculando las radios a la columna 'Género' en la matriz de clientes. Espero que puedas ayudar? – jqwha
oops. Debería ser [{ID: 1, Nombre: 'Bob', Género: 'Hombre'}, {ID: 2, Nombre: 'Hilary', Sexo: 'Mujer'}, ...] Estoy seguro de que sé lo que quise decir :) – jqwha