2010-05-17 16 views
5

Tengo un ListView de ASP.NET paginado. Los datos que se muestran están filtrados, que pueden controlarse mediante un formulario. Cuando el formulario de filtro cambia, creo una nueva consulta y realizo un DataBind.Cómo forzar que ListView muestre la primera página mediante programación

El problema, sin embargo, cuando voy a la página siguiente y configuro un filtro, ListView muestra "No se devolvieron datos". Eso no es extraño, porque después de aplicar el filtro, solo hay una página de datos.

Entonces, lo que quiero hacer es reiniciar el busca. ¿Es esa una solución correcta para el problema? ¿Y cómo hago eso?

+0

¿Utiliza QueryStringFields en el Buscapersonas o el de ViewState? – eugeneK

+0

No. La única cosa no estándar que estoy haciendo es reconstruir la consulta Linq con cada devolución ... – doekman

Respuesta

9

utilizo este truco en mi controlador de carga. No restablecerá el localizador si el número de elementos resultantes es el mismo, pero el índice de página seguirá siendo válido, así que puedo vivir con eso por el momento.

+0

Funciona para mí. Asegúrese de configurar esto antes de que la vista de lista esté vinculada a los datos. – rdans

4

Si sabes cómo hacerlo, es simple. He añadido el código de abajo a mis onchange -Eventos de mi filtro:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager; 
if (pager != null) 
{ 
    pager.SetPageProperties(0, pager.PageSize, true); 
} 
1

Cualquiera de las soluciones anteriores es correcta ya que ambas llaman al mismo método. Simplemente creo que debe señalarse que debe llamar al yourPagerElement.SetPageProperties(...) donde desee que se actualice su fuente de datos (es decir, una lista o una matriz, etc.). Por ejemplo, después de aplicar alguna filtración o algo que cambia en gran medida el tamaño de la lista.

0

Usted puede tener problemas si su vista de lista está limitada de forma automática (es decir, ObjectDataSource) gestor de eventos

de carga no funciona, porque hay que todavía no es el nuevo valor DataPager.TotalRowPage, pero se puede manejar Page_PreRenderComplete, como esto:

protected void Page_PreRenderComplete(object sender, EventArgs e) 
    { 
     // PreRenderComplete occurs just after databindings page events 
     // And saves to viewstate 

     // Trick on search to avoid "No data" on results when old page is greater than actual row count     
     if (DataPager1.StartRowIndex > DataPager1.TotalRowCount) 
      DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true); 
    } 

Esto siempre deja ListView en una página con datos. Si la página es mayor que TotalRow, cambie a la primera página.

Notas: Estoy usando paginación Efectiva, y devolver sólo los datos que se mostrará, así que tengo que volver a enlazar de origen de datos (último parámetro (verdadero))

Contras: databind doble si StartRowIndex es mayor que TotalRowCount .

Cuestiones relacionadas