Pergunta

Eu tenho um ASP.NET LISTVIEL Pagrado. Os dados mostrados são filtrados, que podem ser controlados por um formulário. Quando o formulário do filtro muda, crio uma nova consulta e executo um banco de dados.

O problema, no entanto, quando vou para a próxima página e defino um filtro, o ListView mostra "nenhum dado foi retornado". Isso não é estranho, porque após a aplicação do filtro, há apenas uma página de dados.

Então, o que eu quero fazer é redefinir o pager. Essa é uma solução correta para o problema? E como faço isso?

Foi útil?

Solução

Eu uso esse hack no meu manipulador de carga. Não será redefinido o pager se o número de itens de resultado for o mesmo, mas o índice da página ainda será válido para que eu possa conviver com isso por enquanto.

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

Outras dicas

Se você sabe como fazê -lo, é simples. Eu adicionei o código abaixo ao meu onchange-Eventos do meu filtro:

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

Qualquer uma das soluções acima está correta, pois ambas chamam o mesmo método. Eu só acho que deve ser apontado que você deve ligar yourPagerElement.SetPageProperties(...) Onde quer que você queira sua fonte de dados (ou seja, uma lista ou uma matriz, etc.) a ser atualizada. Por exemplo, depois de aplicar alguma filtragem ou algo que altera muito o tamanho da lista.

Você pode ter problemas se o seu ListView estiver limitado automaticamente (ou seja, objectDataSource)

O manipulador de eventos de carregamento não funciona, porque você ainda não o fez o novo valor do DataPager.TotalRowPage, mas pode lidar com Page_PrenderComplete, assim:

    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);
    }

Isso sempre deixa a ListView em uma página com dados. Se a página for maior que a TotalRow, mude para a primeira página.

Notas: Estou usando paginação efetiva e retornando apenas os dados a serem exibidos, então preciso rebindar de DataSource (Último parâmetro (true))

Contras: Banco de dados duplo se o StartrowIndex for maior que o TotalRowCount.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top