Pregunta

Tengo un paginado ASP.NET ListView. Los datos mostrados se filtra, que pueden ser controlados por una forma. Cuando la forma del filtro cambia, que crean una nueva consulta, y realizan una DataBind.

El problema, sin embargo, cuando voy a la página siguiente, y establecer un filtro, los espectáculos ListView "No hay datos fue devuelto". Eso no es raro, porque después de aplicar el filtro, sólo hay una página de datos.

Así que lo que quiero hacer es restablecer el buscapersonas. Es que una solución correcta al problema? Y ¿cómo puedo hacer eso?

¿Fue útil?

Solución

Yo uso este truco en mi controlador de carga. No va a restablecer el localizador si el número de elementos de resultado es el mismo, pero el índice de página seguirá siendo válida para que pueda vivir con eso por ahora.

if (IsPostBack)
{
    DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
    if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
    {
        pgr.SetPageProperties(0, pgr.MaximumRows, false);
    }
}

Otros consejos

Si sabe cómo hacerlo, es muy sencillo. He añadido el código de abajo a mis onchange-sucesos de mi filtro:

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

Cualquiera de las anteriores soluciones son correctas, ya que ambos llamada el mismo método. Sólo creo que hay que señalar que se debe llamar yourPagerElement.SetPageProperties(...) donde usted quiere que su fuente de datos (es decir, una lista o una matriz, etc.) que actualizarse. Por ejemplo, después de aplicar un poco de filtración o algo que cambia en gran medida el tamaño de la lista.

Se puede tener problemas si su vista de lista está limitada de forma automática (es decir ObjectDataSource)

controlador 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 los 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top