PRB: ASP.NET löst Das Change-Ereignisse aus, wenn Sie den Kontrolle-Wert nicht ändern

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 314809 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie die Steuerung nicht ändern, löst ASP.NET unter bestimmten Umständen das Das Change-Ereignis für ein Asp.net-webanwendungssteuerelement aus.

Ursache

Um Anzeigestatus zu verwenden, basieren einige Steuerelemente, wie dem Ereignis SelectedIndexChanged in einem Steuerelement DropDownList oder dem Ereignis TextChanged in einem Boxsteuerelement Text auf der Registrierung des Das Change-Ereignisses. Dieses Problem tritt auf, wenn Sie diese Steuerelemente dynamisch erstellen, nachdem das Ereignis verknüpft wird.

Wenn ASP.NET die Seite an dem Browser darstellt, verfügt das Steuerelement, das dynamisch erstellt wird, nicht über ein gehören Das Change-Ereignis. ASP.NET speichert den Anzeigestatus nicht, weil kein Ereignis vorhanden ist. Das wird als View State Optimization bezeichnet.

ASP.NET erwartet Anzeigestatus, wenn die Seite wieder gesandt und wenn die Ereignisse verknüpft werden aber findet, kein ist vorhanden. Wenn das Steuerelement nicht geändert worden ist, löst dieser Unterschied das Das Change-Ereignis aus.

Lösung

Stellen Sie sicher, dass Sie das Das Change-Ereignis für das dynamisch erstellte Steuerelement verknüpfen, bevor ASP.NET die Seite darstellt. Das stellt sicher, dass Anzeigestatus für das Steuerelement vorhanden ist.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

Erstellen Sie das Web Form

  1. Erstellen Sie eine neue Anwendung von Visual Basic ASP.NET mit Name ChangeFired.
  2. Öffnen Sie in dem Designer-Modus WebForm1. Ziehen Sie ein Steuerelement DataList, ein Steuerelement Button und ein Steuerelement DataSet auf dem Formular.
  3. Klicken Sie in dem Dialogfeld DataSet hinzufügen auf Untyped dataset, und klicken Sie dann auf OK. Behalten Sie die Standardname für alle Steuerelemente bei.
  4. Bearbeiten Sie die Tables-Auflistung von DataSet1. Fügen Sie eine neue Tabelle mit Name Table1 hinzu.
  5. Bearbeiten Sie die Columns-Auflistung von Table1. Fügen Sie eine neue Spalte hinzu, die Spalte1 genannt wird.
  6. Klicken Sie auf DataList1, und ändern Sie dann in dem DataSet1 die DataSource Eigenschaft.
  7. Klicken Sie mit der rechten Maustaste auf DataList1, zeigen Sie auf Vorlage bearbeiten, und klicken Sie dann auf Sie auf Elementvorlagen. Ziehen Sie in dem Abschnitt ItemTemplate ein DropDownList Steuerelement.
  8. Klicken Sie auf DropDownList1, und fügen Sie der Item-Auflistung dann fünf Elemente hinzu. Legen Sie den Text und den Value Eigenschaften dieser Elemente To fest one , two, three , four, Und five jeweils.
  9. Legen Sie für die Eigenschaft AutoPostBack True für DropDownList1 fest.
  10. Bearbeiten Sie die DataBindings-Auflistung von DropDownList1. Fügen Sie den folgenden benutzerdefinierten Bindungsausdruck auf der Eigenschaft SelectedIndex hinzu:
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Wechseln Sie in die HTML-Ansicht Legen Sie das Attribut der Ablaufverfolgung auf True wie folgt in der Direktive @ Page fest:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Fügen Sie die CodeBehind-Datei hinzu

  1. Klicken Sie mit der rechten Maustaste auf WebForm1.aspx, und klicken Sie dann auf Code anzeigen.
  2. Fügen Sie dem Ereignis Page Load den folgenden Code hinzu:
    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. Erstellen Sie eine neue Prozedur Sub unterhalb des Ereignisses Page Load, um das SelectedIndexChanged Ereignis wie folgt zu bearbeiten:
    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
    					

Ausführen des Beispiels

  1. Führen Sie die Seite aus Beachten Sie, dass das dynamisch erstellte DropDownList Steuerelement Anzeigestatus in der Ablaufverfolgungsinformation für die Steuerelementstruktur enthält.

    Das tritt auf, da der Aufruf der DataBind Methode dynamisch die Steuerelemente DropDownList erstellt und Sie das Ereignishandler verknüpfen, nachdem das DataBind in dem Ereignis Page Load aufruft. View State Optimization findet nicht statt, da die Steuerelemente ein Ereignishandler haben.
  2. Klicken Sie auf die Schaltfläche auf die Seite. Beachten Sie, dass wieder eine PLZ auftritt, und nur der Code innerhalb des Ereignisses Page Load ausgeführt wird. Anzeigestatus ist für die Steuerelemente DropDownList vorhanden, da dem Steuerelement ein Ereignishandler zugeordnet wird.
  3. Ändern Sie den Wert in einem der Steuerelemente DropDownList. Beachten Sie, dass wieder eine PLZ auftritt. Beachten Sie darüber hinaus, dass ASP.NET das Ereignis Page Load auslöst, und das DropDownList1 SelectedIndexChanged Ereignis ausführt.
  4. Rufen Sie in dem Ereignis DropDownList1 SelectedIndexChanged die DataBind Methode erneut auf, neue Steuerelemente DropDownList zu erstellen.

    ASP.NET verwendet View State Optimization und speichert den Anzeigestatus DropDownList für die neuen Steuerelemente nicht, da das SelectedIndexChanged Ereignis DropDownList in diesen neuen Steuerelementen nicht verknüpft wird.
  5. Überprüfen Sie die Information der Ablaufverfolgung für die Steuerelementstruktur. Beachten Sie, dass die Steuerelemente DropDownList Anzeigestatus nicht besitzen.
  6. Klicken Sie auf die Schaltfläche auf die Seite. Beachten Sie, dass wieder die PLZ auftritt, und beachten Sie dass ASP.NET das Ereignis Page Load ausführt. ASP.NET erwartet, da Sie das SelectedIndexChanged Ereignis zu den Steuerelementen DropDownList verknüpfen, den Steuerelementen Anzeigestatus zugeordnet.

    Obwohl Sie ein Element nicht auswählen, löst ASP.NET das SelectedIndexChanged Ereignis jedoch aus, da Anzeigestatus nicht vorhanden ist.

Lösun

Dem Codes in dem Ereignis DropDownList1 SelectedIndexChanged Kommentar- Sie, um dieses Problem zu beheben, damit die Ereignishandler mit dem neu erstellten Steuerelement verknüpft.

Eigenschaften

Artikel-ID: 314809 - Geändert am: Montag, 3. Mai 2004 - Version: 2.7
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Keywords: 
kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtde kbmt
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 314809
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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