Pergunta

Eu tenho um controle ListView que está exibindo um comportamento estranho - linhas são apenas parcialmente a actualização depois de um postback. Eu estou esperando que alguém aqui pode lançar alguma luz sobre por que isso pode estar ocorrendo.

O meu listview DataSource está vinculado a uma lista de itens que é armazenado no estado da sessão página. Isso é intencional, parcialmente ao tempo limite vistas fora da data, uma vez que vários usuários visualizar os dados. Em uma operação simples resort, a classificação é feita na página via javascript, e da ordem de dados / lista de sessão é mantido em sincronia via chamadas de retorno. Callback também verifica a existência de níveis de permissões. Em uma operação de recurso especial que é mais complicado, o javascript na página faz um postback para a página para lidar com a lógica de classificação. A Lista / sessão é atualizado como no retorno de chamada, em seguida, o controle listview é rebote aos dados. A página carrega de novo, e as linhas mostram a nova ordem. Não tem problema, certo?

O problema é que alguns dos elementos na listview não alterar o valor de acordo com a nova ordem. Enquanto os hiperlinks e texto que é processado na página (ou seja, como <% # Eval ( "ProjectAbbrev")%>) são atualizados apropriadamente, caixas de seleção, literais e dropdowns que têm seus valores definidos através do método de evento OnItemDataBound não são - eles estadia "congelado" no lugar, embora percorrendo o código revela que o método é executado durante a postagem, e que os controlos devem ser definidas para seus novos valores. Se eu for e truncar manualmente a lista de dizer, a metade do tamanho original, com certeza apenas os itens são repovoada, mas as caixas e tal ainda mantêm seus valores originais.

Então, minha pergunta é: Por que não são esses elementos de atualização juntamente com o resto dos elementos de controle listview sobre a postagem? Tenho a sensação de que estou tanto mal-entendido o ciclo de vida de página no ASP.NET ou que encontrou um bug de algum tipo.

Neste momento eu estou pensando que vou ter que mover a operação de classificação mais complicada para a página em javascript, mas isso vai ser bastante complicado e eu gostaria de evitar fazê-lo, se possível.


UPDATE: Eu tentei definir EnableViewState para false e não corrigir isso. Eu não poderia usar essa tática em qualquer caso porque outras partes da página (SAVE) contam com a leitura do viewstate no final.
UPDATE: Eu estou fornecendo alguns trechos de código na esperança de que eles podem lançar alguma luz sobre esta questão:

Página: O elemento HyperLink irá atualizar corretamente após nova postagem, mas o CheckBox que tem o seu valor atribuído no método OnQueueRepeater_ItemDataBound, vai ficar na mesma.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
 <ItemTemplate>
  <tr>
   <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
   <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
  </tr>
 </ItemTemplate>
</asp:ListView>

código por trás: Na postagem, as executa o seguinte código:

protected List<Book> QueueDataItems
{
 get { return (List<Book>)Session["Queue"]; }
 set { Session["Queue"] = value; }
}

else if (IsPostBack && !Page.IsCallback)
{
 // resort QueueDataItems List appropriately
 ResortQueue(Request.Params) 
 // rebind
 QueueListView.DataSource = QueueDataItems;
 QueueListView.DataBind();
}

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
 // ...
 // ... other controls set
 CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
 scannedCheckBox.Checked = book.Scanned;
}

UPDATE: Eu já desistiu de começar este trabalho e se mudou minha lógica de classificação para o lado do cliente com javascript. Se alguém tiver alguma idéia de por que esse comportamento estranho estava acontecendo, porém, eu ainda estaria muito interessado em ouvi-los!

Foi útil?

Solução

fora do interesse, o ponto da página que você está ligação de dados on? Page_Load?

Experimente-o em OnPreRender -. Pode ajudar

Outras dicas

Parece que o ViewState está retrocedendo dentro e repovoar os dados. Em qualquer caso, se você é ligação de dados em cada nova postagem de qualquer maneira, você provavelmente deve definir o EnableViewState do seu ListView para false para reduzir o tamanho da página.

Eu acho que isso está relacionado com a ordem de quando os diferentes eventos são acionados durante o ciclo de vida de página. Consulte ASP.NET página Ciclo de Vida Overview . Você deve fazer ligação de dados em Page_OnPreRender para garantir que o replopulating é feito depois de eventos de controle (que fará com que a actualização de dados) na página.

Talvez seu QueueListView está sendo re-bound por algum motivo.

Tente repor o valor DataSource após a DataBind () para ver o que acontece

QueueListView.DataBind();
QueueListView.DataSource = null;

Qualquer chance que este poderia ser um problema de cache? Corri para um problema semelhante usando um listview com um XmlDataSource. Eu tentei desligar todo o viewstate. Gostaria de vincular a listview no código por trás e usar XPath para escrevê-lo tudo para a tela na minha página aspx. Este foi usado em uma pesquisa .... a próxima vez que eu fiz uma pesquisa, nenhuma das novas informações apareceu. A razão é porque um XmlDataSource tem cache habilitado por padrão. No meu caso eu era bater o DB cada vez e não tinha necessidade de armazená-lo. Desliguei o cache no fonte de dados e todos os meus problemas foram corrigidos.

Eu só mencionar isto porque o erro que eu estava tendo sons idênticos aos seus. Eu não posso ver como você está recuperando livro na ItemDataBound - e você não estiver usando uma fonte de dados XML pela aparência das coisas ..... mas eu pensei que o comentário pode desencadear algo para você. Boa sorte .... que isso soa como você já seguiu em frente: -).

O controle caixa ReadOnly = true ou Ativado = false?

Eu tive problemas com controles com uma dessas propriedades definidas como acima não atualizar, não importa o quanto eu tente manipular o controle na trás código. Eu acho que a desativação do viewstate seria também de bypass que pouco "característica" do ASP.NET, mas vale a pena um tiro.

Além disso, se os itens são ordenados por meio de código clientside, é que ordenação preservado no postback? Eu não acho que você pode alterar o objeto CLR que você tem em sessão via javascript.

Não sei se isso ajuda, substitua <% # Eval ( "ProjectAbbrev")%> com o Hyperlink.Text atribuído no método OnQueueRepeater_ItemDataBound e ver se todas as linhas são preenchidos corretamente.

Isso provavelmente não vai resolver o seu problema, mas vai ser interessante saber o resultado.

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