2011-07-29 36 views
5

Al desarrollar mi primera aplicación ASP.NET MVC 3 usando jqGrid para mostrar algunos datos, estoy usando los filtros de encabezado de columna y también la barra de herramientas de filtro avanzada filtrando para ser hecho. Independientemente, estas cosas funcionan bastante bien.Dos preguntas relacionadas sobre los filtros de encabezado de columna jqGrid y el cuadro de diálogo de filtro avanzado

Primera pregunta - ¿Alguien tiene una solución para comunicar la configuración actual del filtro de encabezado de columna a los filtros avanzados?

Como ejemplo, un usuario puede filtrar en la columna "Ice Cream Name", ingresando un nombre parcial, por ejemplo, "Chocolate", y se filtrará a "Chocolate Explosion", "Dark Chocolate", etc. . - estupendo. Lo que sería bueno sería abrir el filtro avanzado y hacer que el filtro de columna "contiene 'Chocolate'" se rellene automáticamente en el filtro avanzado. Reconozco que la otra dirección (donde alguien podría Y u O dos valores para la misma columna, por ejemplo, "Chocolate" O "Caramelo") se vuelve problemática, pero en la otra dirección, parece que podría ser posible. Tal vez esto es solo un ajuste de la grilla que me falta. ¿Alguien resolvió esto?

Segunda pregunta - Actualmente puedo hacer algunos filtros con los filtros del encabezado de columna, mostrar algunos resultados en la grilla y luego ir al cuadro de diálogo de filtro avanzado y configurar un filtro diferente. Esto mostrará los resultados correctos, pero los filtros de encabezado de columna no se borran, dando la impresión de que el filtrado no funciona. ¿Cómo puedo restablecer esos filtros de encabezado de columna después de que el uso haga clic en el botón "Buscar" en el cuadro de diálogo?

Respuesta

16

Me parece muy interesante su pregunta, así que preparé the demo que demuestran cómo se puede combinar el diálogo Advanced Searching y Toolbar Searching en una cuadrícula.

Un truco importante, pero simple es el uso de recreateFilter: true. Por defecto, el diálogo de búsqueda se creará una vez y luego solo se ocultará o se mostrará. Como resultado, el parámetro postData.filters no se actualizará. Después de configurar recreateFilter: true se resolverá el problema con el llenado del diálogo de búsqueda avanzada con los valores de la barra de herramientas de búsqueda. Yo personalmente puse las opciones de búsqueda por defecto como la siguiente

$.extend(
    $.jgrid.search, 
    { 
     multipleSearch: true, 
     multipleGroup: true, 
     recreateFilter: true, 
     overlay: 0 
    } 
); 

ahora a la parte más compleja de la solución es la función refreshSerchingToolbar que escribí. La función no es tan simple, pero es simplemente en uso:

loadComplete: function() { 
    refreshSerchingToolbar($(this), 'cn'); 
} 

El último parámetro es el mismo parámetro que utilizaste como defaultSearch propiedad del método de la barra de herramientas de búsqueda filterToolbar (el valor por defecto es 'pc', pero yo personalmente prefiero usar 'cn' y establecer el parámetro jqGrid ignoreCase: true).

Si se llena el cuadro de diálogo de búsqueda avanzada en the demo con el siguiente campo

enter image description here

y hace clic en el botón "Buscar", que tendrá la siguiente tabla:

enter image description here

(Marqué la columna 'Total' como no buscable con respecto a search: false para mostrar solo que todo funciona correctamente en el caso también)

Se puede ver que todos los campos de la barra de herramientas de búsqueda excepto "Cantidad" se rellenan con los valores del cuadro de diálogo de búsqueda. El campo no se llena porque utilizamos la operación "rallador o igual" en lugar de "igual". La función refreshSerchingToolbar llena sólo los elementos de la barra de herramientas de búsqueda que puede ser producido por el

Así como un recordatorio debería mencionar que en el caso del uso de Filter Toolbar es muy importante definir searchoptions.sopt opciones del colModel. Para todas las columnas que no sean cadenas contiene (fechas, números, selecciones, int, moneda) es extremadamente importante tener 'eq' como el primer elemento de la matriz sopt. Vea here y here para más detalles.

Si cambia el filtro del diálogo avanzado a la siguiente

enter image description here

tendrá que esperar

enter image description here

Al final incluyo el código de la función refreshSerchingToolbar :

var getColumnIndex = function (grid, columnIndex) { 
     var cm = grid.jqGrid('getGridParam', 'colModel'), i = 0, l = cm.length; 
     for (; i < l; i += 1) { 
      if ((cm[i].index || cm[i].name) === columnIndex) { 
       return i; // return the colModel index 
      } 
     } 
     return -1; 
    }, 
    refreshSerchingToolbar = function ($grid, myDefaultSearch) { 
     var postData = $grid.jqGrid('getGridParam', 'postData'), filters, i, l, 
      rules, rule, iCol, cm = $grid.jqGrid('getGridParam', 'colModel'), 
      cmi, control, tagName; 

     for (i = 0, l = cm.length; i < l; i += 1) { 
      control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 
      if (control.length > 0) { 
       tagName = control[0].tagName.toUpperCase(); 
       if (tagName === "SELECT") { // && cmi.stype === "select" 
        control.find("option[value='']") 
         .attr('selected', 'selected'); 
       } else if (tagName === "INPUT") { 
        control.val(''); 
       } 
      } 
     } 

     if (typeof (postData.filters) === "string" && 
       typeof ($grid[0].ftoolbar) === "boolean" && $grid[0].ftoolbar) { 

      filters = $.parseJSON(postData.filters); 
      if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") { 
       // only in case of advance searching without grouping we import filters in the 
       // searching toolbar 
       rules = filters.rules; 
       for (i = 0, l = rules.length; i < l; i += 1) { 
        rule = rules[i]; 
        iCol = getColumnIndex($grid, rule.field); 
        cmi = cm[iCol]; 
        control = $("#gs_" + $.jgrid.jqID(cmi.name)); 
        if (iCol >= 0 && control.length > 0) { 
         tagName = control[0].tagName.toUpperCase(); 
         if (((typeof (cmi.searchoptions) === "undefined" || 
           typeof (cmi.searchoptions.sopt) === "undefined") 
          && rule.op === myDefaultSearch) || 
           (typeof (cmi.searchoptions) === "object" && 
            $.isArray(cmi.searchoptions.sopt) && 
            cmi.searchoptions.sopt[0] === rule.op)) { 

          if (tagName === "SELECT") { // && cmi.stype === "select" 
           control.find("option[value='" + $.jgrid.jqID(rule.data) + "']") 
            .attr('selected', 'selected'); 
          } else if (tagName === "INPUT") { 
           control.val(rule.data); 
          } 
         } 
        } 
       } 
      } 
     } 
    }; 

ACTUALIZADO: El código anterior ya no es necesario en caso de uso free jqGrid 4.13.1 o superior. Contiene la nueva opción por defecto del loadFilterDefaults: truefilterToolbar, que actualiza los valores de la barra de herramientas de filtro y las operaciones de filtro (si se ralizar searchOperators: true opción de filterToolbar) si se ha armado postData.filters y search: true (se aplica el filtro). El jqGrid gratuito actualiza la barra de herramientas de filtro en jqGridAfterLoadComplete (si loadFilterDefaults: true están configurados) o si el evento jqGridRefreshFilterValues está explícitamente activado.

+0

@itsmatt: ¿Es esto lo que necesita? – Oleg

+0

Eso es bastante completo, Oleg. ¡Agradezco la profundidad de tu respuesta! – itsmatt

+0

Una de las complicaciones que tengo con el filtrado de fechas es que tal vez quiera filtrar el nivel mensual y hasta ahora he resuelto esto usando GT (mayor que) como mi operador, así que si quería ver los datos de junio podría filtrar a GT 1 de junio de 2011 y aunque no es ideal, me da todos los datos de junio (junto con, como efecto secundario, los datos de julio también). Sin embargo, eso es solo un ajuste en el selector de fechas, necesito ver eso, entonces el ecualizador funcionaría bien, supongo. – itsmatt

1

Sé que es una publicación anterior, pero si tiene varias cuadrículas en la misma página, el código anterior puede agregar el texto del filtro a la cuadrícula incorrecta.

El cambio de este en el primer bucle en refreshSearchingToolbar, desde

control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 

a

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cm[i].name)); 

y esto en el segundo bucle de

control = $("#gs_" + $.jgrid.jqID(cmi.name)); 

a

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cmi.name)); 

debería hacer el truco.

Felicitaciones a Oleg

Cuestiones relacionadas