PRB: ASP.NET genera gli eventi modifica anche se non si modifica il valore del controllo

Traduzione articoli Traduzione articoli
Identificativo articolo: 314809 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

In determinate circostanze, in ASP.NET viene generato il Modifica evento per un Web di ASP.NET il controllo anche se non si modifica il controllo.

Cause

Alcuni controlli, ad esempio l'evento SelectedIndexChanged in un controllo DropDownList o l'evento TextChanged in un controllo TextBox , si basano sulla registrazione dell'evento di modifica per utilizzare lo stato di visualizzazione. Si verifica questo problema quando si creano questi controlli in modo dinamico dopo che è collegato l'evento.

Quando esegue il rendering nella pagina per il browser, i controlli che vengono creati dinamicamente non dispone di un evento di modifica associato. Poiché nessun evento è presente, ASP.NET non salva lo stato di visualizzazione. Si tratta di ottimizzazione dello stato di visualizzazione.

Quando la pagina viene inviata nuovamente e quando gli eventi sono associati, ASP.NET prevede lo stato di visualizzazione ma rileva che non ne esiste alcuno. Questa differenza genera l'evento di modifica, anche se il controllo non è stato modificato.

Risoluzione

Assicurarsi di agganciare l'evento Change per controlli creati dinamicamente prima di rendering della pagina. Ciò garantisce l'esistenza di stato di visualizzazione per il controllo.

Status

Questo comportamento legato alla progettazione.

Informazioni

Procedura per riprodurre il problema.

Creare il Web Form

  1. Consente di creare una nuova applicazione di Visual Basic ASP.NET denominata ChangeFired.
  2. Aprire WebForm1 in modalità progettazione. Trascinare un controllo DataList , un controllo Button e un controllo DataSet nel form.
  3. Nella finestra di dialogo Aggiungi DataSet , fare clic su dataset non tipizzato e scegliere OK . Consente di mantenere i nomi predefiniti per tutti i controlli.
  4. Modificare l'insieme di tabelle per DataSet1. Aggiungere una nuova tabella denominata Tabella1.
  5. Modificare l'insieme di colonne per Table1. Aggiungere una nuova colonna denominata Colonna1.
  6. Fare clic su DataList1 e quindi modificare la proprietà DataSource per DataSet1 .
  7. Fare clic con il pulsante destro del mouse su DataList1 , scegliere Modifica modello e scegliere Modelli di elemento . Trascinare un controllo DropDownList per la sezione di ItemTemplate .
  8. Fare clic su DropDownList1 e quindi aggiungere cinque elementi all'insieme di elementi. Impostare il testo e le proprietà di valore di questi elementi rispettivamente su uno , due , tre , quattro e cinque .
  9. Impostare la proprietà AutoPostBack su true per DropDownList1.
  10. Modificare l'insieme DataBindings DropDownList1. Aggiungere l'espressione di associazione personalizzata riportata di seguito alla proprietà SelectedIndex :
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Passare alla visualizzazione HTML. Impostare l'attributo di traccia su true nella direttiva @ Page , come indicato di seguito:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Aggiungere il file code-behind

  1. Fare clic con il pulsante destro del mouse su WebForm1.aspx e quindi fare clic su Visualizza codice .
  2. Aggiungere il seguente codice all'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. Creare una nuova routine Sub sotto l'evento Page_Load per gestire l'evento SelectedIndexChanged nel modo seguente:
    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
    					

Esecuzione del codice di esempio

  1. Eseguire la pagina. Si noti che i controlli DropDownList creati dinamicamente contengano lo stato di visualizzazione nelle informazioni di traccia per la struttura di controllo.

    Questo si verifica perché la chiamata al metodo DataBind crea dinamicamente i controlli DropDownList e agganciare il gestore eventi dopo il DataBind chiamato nell'evento Page_Load . Poiché i controlli dispongono di un gestore eventi, ViewState ottimizzazione non ha luogo.
  2. Fare clic sul pulsante nella pagina. Si noti che si verifica un postback e viene eseguito solo il codice interno dell'evento Page_Load . Per i controlli DropDownList esiste lo stato di visualizzazione per un gestore eventi è associato al controllo.
  3. Modificare il valore in uno dei controlli DropDownList . Si noti che si verifica un postback. Inoltre, si noti che ASP.NET viene generato l'evento Page_Load e che viene eseguito l'evento DropDownList1_SelectedIndexChanged .
  4. Nell'evento DropDownList1_SelectedIndexChanged , chiamare il metodo DataBind per creare nuovi controlli DropDownList .

    Poiché l'evento SelectedIndexChanged non è collegato a questi nuovi controlli DropDownList , ASP.NET utilizza l'ottimizzazione dello stato di visualizzazione e non salva lo stato di visualizzazione per i nuovi controlli DropDownList .
  5. Esaminare le informazioni traccia per la struttura di controllo. Si noti che i controlli DropDownList non dispongono di stato di visualizzazione.
  6. Fare clic sul pulsante nella pagina. Si noti che si verifica il postback e notare che in ASP.NET viene eseguito l'evento Page_Load . Poiché è associare l'evento SelectedIndexChanged ai controlli DropDownList , ASP.NET prevede stato di visualizzazione da associare i controlli.

    Tuttavia, poiché lo stato di visualizzazione non esiste, ASP.NET genera l'evento SelectedIndexChanged , in anche se non si seleziona un elemento.

Risoluzione

Per risolvere il problema, rimuovere il commento del codice nell'evento DropDownList1_SelectedIndexChanged in modo che i gestori eventi agganciare i controlli appena creato.

Proprietà

Identificativo articolo: 314809 - Ultima modifica: lunedì 3 maggio 2004 - Revisione: 2.7
Le informazioni in questo articolo si applicano a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Chiavi: 
kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 314809
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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