O problema: ASP.NET accionado eventos Alterar mesmo se não alterar o valor do controlo

Traduções de Artigos Traduções de Artigos
Artigo: 314809 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Em determinadas circunstâncias, o ASP.NET é accionado alterar controlar eventos para uma Web do ASP.NET, mesmo se não alterar o controlo.

Causa

Alguns controlos, tais como o evento SelectedIndexChanged num controlo DropDownList ou um controlo de caixa de texto , o evento TextChanged dependem o registo de evento alterar através do estado da vista. Encontrar este problema ao criar estes controlos dinamicamente depois do evento está ligado.

Quando o ASP.NET torna a página para o browser, os controlos que são criados de forma dinâmica não tem um evento alterar associado. Uma vez que nenhum evento está presente, o ASP.NET não guarda o estado da vista. É designada por optimização de estado de ver.

Quando a página é novamente registada e os eventos são ligados, o ASP.NET espera estado da vista mas localiza existe nenhum. Esta diferença é accionado o evento alterar mesmo se não tiver sido alterado no controlo.

Resolução

Certifique-se de que pode ligar o evento alterar controlos dinamicamente criados antes do ASP.NET torna a página. Isto assegura que o estado da vista para o controlo existe.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

Criar o formulário da Web

  1. Crie uma aplicação do Visual Basic ASP.NET nova denominada ChangeFired.
  2. Abra o WebForm1 no modo de designer. Arraste um controlo DataList , um controlo de botão e um controlo de DataSet para o formulário.
  3. Na caixa de diálogo Adicionar DataSet , clique em sem tipos de conjunto de dados e, em seguida, clique em OK . Manter os nomes predefinidos para todos os controlos.
  4. Edite o conjunto de tabelas para DataSet1. Adicione uma nova tabela denominada Tabela1.
  5. Edite o conjunto de colunas para tabela1. Adicione uma nova coluna denominada coluna1.
  6. Clique DataList1 e, em seguida, altere a propriedade de origem de dados para DataSet1 .
  7. Clique com o botão direito do rato DataList1 , aponte para Editar modelo e, em seguida, clique em Item de modelos . Arraste um controlo DropDownList à secção ItemTemplate .
  8. Clique em DropDownList1 e, em seguida, adicionar cinco itens à colecção de itens. Definido o texto e as propriedades valor destes itens para um , dois , três , quatro e cinco respectivamente.
  9. Defina a propriedade AutoPostBack como true para DropDownList1.
  10. Edite o conjunto de DataBindings para DropDownList1. Adicionar a seguinte expressão de ligação personalizada a propriedade SelectedIndex :
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Mude para vista de HTML. Definido o atributo de rastreio como true na directiva @ Page , da seguinte forma:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Adicionar o ficheiro de código após

  1. Clique com o botão direito do rato em WebForm1.aspx e, em seguida, clique em Código .
  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. Criar um novo procedimento sub abaixo ao evento Page_Load para processar o evento SelectedIndexChanged da seguinte forma:
    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. Repare que os controlos DropDownList dinamicamente criados contêm o estado da vista nas informações de rastreio para a árvore de controlo.

    Isto ocorre porque a chamada ao método DataBind dinamicamente cria os controlos DropDownList e ligar o processador de eventos depois de chamar DataBind no evento Page_Load . Uma vez que os controlos têm um processador de eventos, ver estado optimização não tem lugar.
  2. Clique no botão na página. Repare que ocorre uma mensagem novamente e apenas o código no evento Page_Load é executado. Estado da vista existe para os controlos DropDownList porque um processador de eventos está associado com o controlo.
  3. Altere o valor de um dos controlos DropDownList . Repare que ocorre uma mensagem novamente. Para além disso, repare que o ASP.NET é accionado evento Page_Load e é executado o evento DropDownList1_SelectedIndexChanged .
  4. No evento DropDownList1_SelectedIndexChanged , chame o método DataBind novamente para criar novos controlos DropDownList .

    Porque o evento SelectedIndexChanged não está ligado a estes novos controlos DropDownList , o ASP.NET utiliza Ver estado de optimização e não guarda o estado de vista para os novos controlos DropDownList .
  5. Reveja as informações rastreio para a árvore de controlo. Repare que os controlos DropDownList não têm o estado da vista.
  6. Clique no botão na página. Repare que ocorre a mensagem novamente e repare que o ASP.NET é executado o evento Page_Load . Uma vez que ligar o evento SelectedIndexChanged controlos DropDownList , ASP.NET espera estado da vista a associar os controlos.

    É no entanto, porque o estado da vista não existe, o ASP.NET accionado evento SelectedIndexChanged , apesar de não seleccionar um item.

Resolução

Para resolver este problema, uncomment código no evento DropDownList1_SelectedIndexChanged para que os processadores de eventos ligar com os controlos recentemente criados.

Propriedades

Artigo: 314809 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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