PROBLEMA: O ASP.NET dispara eventos Change mesmo se você não altera o valor do controle

Traduções deste artigo Traduções deste artigo
ID do artigo: 314809 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Sob determinadas circunstâncias, o ASP.NET dispara Alterar controle de evento para um ASP.NET mesmo se você não altera o controle.

Causa

Alguns controles, tais como o evento SelectedIndexChanged em um controle DropDownList ou o evento TextChanged em um controle TextBox , contam com o registro do evento Change para usar estado de exibição. Você encontrar esse problema quando você cria esses controles dinamicamente após o evento é conectado.

Quando o ASP.NET processa a página para o navegador, os controles que são criados dinamicamente não tem um evento de alteração associado. Porque nenhum evento está presente, o ASP.NET não salva o estado de exibição. Isso é chamado otimização de estado de exibição.

Quando a página é remetida de volta e quando os eventos são conectados, o ASP.NET espera o estado de exibição mas localiza que não existe nenhum. Essa diferença aciona o evento Change mesmo se o controle não tiver sido alterado.

Resolução

Certifique-se de que você ligar o evento Change para controles criados dinamicamente antes ASP.NET processa a página. Isso garante que o estado de exibição para o controle existe.

Situação

Esse comportamento é por design.

Mais Informações

Passos para reproduzir o problema

Criar o formulário da Web

  1. Crie um novo aplicativo de ASP.NET do Visual Basic chamado ChangeFired.
  2. Abra WebForm1 no modo de designer. Arraste um controle DataList , um controle Button e um controle de DataSet para o formulário.
  3. Na caixa de diálogo Add DataSet , clique em Untyped dataset e, em seguida, clique em OK . Mantenha os nomes padrão para todos os controles.
  4. Edite a coleção Tables para DataSet1. Adicione uma nova tabela chamada Tabela1.
  5. Edite a coleção de colunas de tabela 1. Adicione uma nova coluna chamada Coluna1.
  6. Clique em DataList1 e, em seguida, altere a propriedade DataSource para DataSet1 .
  7. Clique com o botão direito do mouse DataList1 , aponte para Edit Template e em seguida, clique em Item Templates . Arraste um controle DropDownList para a seção ItemTemplate .
  8. Clique em DropDownList1 e adicione cinco itens à coleção Items. Defina o texto e as propriedades valor desses itens para um , dois , três , quatro e cinco respectivamente.
  9. Defina a propriedade AutoPostBack para true para DropDownList1.
  10. Edite a coleção DataBindings DropDownList1. Adicionar a seguinte expressão de ligação personalizada para a propriedade SelectedIndex :
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Alternar para o modo de exibição em HTML. Defina o atributo trace como true na diretiva @ Page da seguinte maneira:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Adicionar o arquivo code-behind

  1. Clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Code .
  2. Adicione o seguinte código ao evento Page_Load :
    DataSet1.Tables(0).Rows.Add(New Object() {"1"})
    DataSet1.Tables(0).Rows.Add(New Object() {"2"})
    DataSet1.Tables(0).Rows.Add(New Object() {"3"})
    DataSet1.Tables(0).Rows.Add(New Object() {"4"})
    
    If Not IsPostBack Then
      DataBind()
    End If
    
    Dim objItem As DataListItem
    For Each objItem In DataList1.Items
      AddHandler CType(objItem.FindControl("DropDownList1"), _
      DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
      If Not objItem.FindControl("DropDownList1") Is Nothing Then
        Trace.Write("Added SelectedIndexChanged Handler")
      End If
    Next
    					
  3. Crie um novo procedimento sub abaixo o evento Page_Load para manipular o evento SelectedIndexChanged da seguinte maneira:
    Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs)
      DataBind()
      Trace.Write("SelectedIndexChanged, DataBind()")
    
      'Uncomment the following code to resolve this problem.
      'Dim objItem As DataListItem
      'For Each objItem In DataList1.Items
      '  AddHandler CType(objItem.FindControl("DropDownList1"), _
      '  DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
      'Next
    End Sub
    					

Executar o exemplo

  1. Execute a página. Observe que os controles DropDownList criados dinamicamente contém o estado de exibição nas informações de rastreamento para a árvore de controle.

    Isso ocorre porque a chamada para o método DataBind cria dinamicamente os controles DropDownList , e você conecta o manipulador de eventos após chamar DataBind no evento Page_Load . Como os controles têm um manipulador de eventos, View State otimização não será realizada.
  2. Clique no botão na página. Observe que ocorre uma postagem de volta, e somente o código dentro do evento Page_Load é executado. Estado de exibição existe para os controles DropDownList porque um manipulador de eventos está associado com o controle.
  3. Altere o valor em um dos controles DropDownList . Observe que ocorre uma postagem de volta. Além disso, observe que o ASP.NET dispara o evento Page_Load e executa o evento DropDownList1_SelectedIndexChanged .
  4. No evento DropDownList1_SelectedIndexChanged , chame o método DataBind novamente para criar novos controles DropDownList .

    Como o evento SelectedIndexChanged não está conectado a esses novos controles DropDownList , ASP.NET usa a otimização de estado de exibição e não salva o estado de exibição para novos controles DropDownList .
  5. Examine as informações rastreamento para a árvore de controle. Observe que os controles DropDownList não tem estado de exibição.
  6. Clique no botão na página. Observe que ocorre a postagem novamente e observe que o ASP.NET é executado o evento Page_Load . Porque você ligar o evento SelectedIndexChanged para os controles DropDownList , ASP.NET espera o estado de exibição a ser associada os controles.

    No entanto, porque o estado de exibição não existe, o ASP.NET dispara o evento SelectedIndexChanged , mesmo que você não selecionar um item.

Resolução

Para resolver esse problema, descomente o código no evento DropDownList1_SelectedIndexChanged poder conectar os manipuladores de eventos com os controles recém-criados.

Propriedades

ID do artigo: 314809 - Última revisão: segunda-feira, 3 de maio de 2004 - Revisão: 2.7
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palavras-chave: 
kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 314809

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com