Gridview desaparece no postback quando paginação está habilitado
-
06-09-2019 - |
Pergunta
Eu tenho um gridview que tem seu conjunto de DataSourceID propriedade para um objeto ObjectDataSource personalizado. Quando AllowPaging é definida como True, o GridView desaparece depois de um postback. Se eu definir AllowPaging para Falso tudo bem. Alguém pode lançar alguma luz sobre isso para mim? :)
Editar: A outra coisa que eu estou confuso sobre se eu pensava que se você definir o DataSourceID que a rede iria receber dados da fonte de dados sempre que ele precisava. Se a grade está desaparecendo porque não está segurando os dados, porque não é o gridview obter os dados de que necessita a partir da fonte de dados?
Solução
É possível que, após a postagem ocorre a fonte de dados não está sendo mantido ou recarregados e não há itens para preencher a grade. Você está lidando estado corretamente para o objeto fonte de dados (religação / mantendo a fonte viva) quando paginação está habilitado?
Isto pode soar como uma resposta vaga, mas sem um exemplo de como a fonte é obter os dados que é meio difícil de diagnosticar por que os itens teria ido.
Edit:
O método que eu estava pensando era para paginação callback / classificação. No entanto ENTENDI encontrar algumas informações ont ele ODS & paginação .. certifique-se de ter definido o seguinte:
- GridView: AllowPaging e fora do curso você precisa definir PageSize.
- ObjectDataSource: EnablePaging, também é necessário definir o:
- MaximumRowsParameterName = "maxRows"
- StartRowIndexParameterName = "StartRowIndex"
- SelectCountMethod = "RecordCount"
Eu acho que você só precisa definir os itens 3 sub no item 2, se você deseja manipular o tamanho de paginação etc manualmente.
Em seguida, você pode ler mais acima neste aqui .
Outras dicas
Para responder a mais de resposta de @ adam0101, o Acho ele quer dizer com "... Acontece que meu costume fonte de dados estava retornando zero para o registro contagem ." , é que você pode precisar de " re-anexar " a fonte de dados para o gridview. ASP.net sabe que você automaticamente está retriving recorde-'n', onde 'n' é a próxima primeira linha da página seguinte. Esta solução é mais para casos em que você não deseja permitir asp.net para tratar automaticamente os dados em seu gridview, talvez devido a querer carregar dados após o outro evento (um botão LOAD DATA por exemplo) , e não quando a página foi carregada pela primeira vez. Mas, como Adam mencionados abaixo a verdadeira razão foi que ele "... criou uma subclasse de fonte de dados que herdou ObjectDataSource, mas foi implementado incorretamente.". Desculpem a minha suposição não Adam. Graças
No entanto, o resto da minha solução que eu acho que vai funcionar para aqueles preso em usar fontes de dados derivados manualmente.
ie
Defina o seu GridView conforme acima, e nota - sem uma propriedade DataSource! Aqui está o meu exemplo:
<asp:GridView ID="gvStudents" DataKeyNames="StudentID" runat="server"
ShowFooter="True" AutoGenerateColumns="False" Width="100%" AllowSorting="True" AllowPaging="true" PageSize="10" OnPageIndexChanging="gvStudents_PageIndexChanging">
Em seguida, faça um método particular ou rotina que você pode chamar sempre que você precisar forçar o gridview em uma nova página.
private void BindGridViewServer(GridView gv1)
{
gv1.DataSource = sdsStudents; //re-attach the datasource
gv1.DataBind(); //get a page of data AllowPaging must be true
}
Em seguida, crie o método OnPageIndexChanging
:
protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView myGV = (GridView)sender;
myGV.PageIndex = e.NewPageIndex;
BindGridViewServer(myGV);
}
Por uma questão de completar a resposta, aqui está o meu código onde eu carregar os dados quando eu quero - não quando um PostPack é disparado, que é o padrão ...
protected void btnSEARCH(object sender, EventArgs e)
{
//some code
//bind the gridview to the datasource here and then bind!
gvStudents.DataSource = sdsStudents;
gvStudents.DataBind();
//more code etc
}