MODÈLE : ASP.NET déclenche les événements de modifier même si vous ne modifiez pas la valeur du contrôle

Traductions disponibles Traductions disponibles
Numéro d'article: 314809 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Dans des circonstances spécifiques, ASP.NET déclenche la modifier événement pour un Web ASP.NET contrôler même si vous ne modifiez pas le contrôle.

Cause

Certains contrôles, tels que l'événement SelectedIndexChanged dans un contrôle DropDownList ou l'événement TextChanged dans un contrôle TextBox , reposent sur l'enregistrement de l'événement change à utiliser l'état d'affichage. Vous rencontrez ce problème lorsque vous créez ces contrôles dynamiquement après que l'événement est associé.

Lorsque ASP.NET affiche la page pour le navigateur, les contrôles qui sont créées dynamiquement inutile un événement de modification associé. Car aucun événement n'est présent, ASP.NET n'enregistre pas l'état d'affichage. Ce est appelé mode état optimisation.

Lorsque la page est validée en et lorsque les événements sont connectés des, ASP.NET attend l'état d'affichage mais détecte qu'aucune n'existe. Cette différence déclenche l'événement change même si le contrôle n'a pas été modifié.

Résolution

Assurez-vous de raccorder l'événement change pour les contrôles créés dynamiquement avant que ASP.NET rend la page. Cela garantit l'existence d'état d'affichage pour le contrôle.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Procédure pour reproduire le comportement

Création du formulaire Web

  1. Créer une application Visual Basic ASP.NET nommée ChangeFired.
  2. Ouvrez WebForm1 en mode concepteur. Faites glisser un contrôle DataList , un contrôle Button et un contrôle de DataSet sur le formulaire.
  3. Dans la boîte de dialogue Ajouter un DataSet , cliquez sur jeu de données non , puis cliquez sur OK . Conserver les noms par défaut pour tous les contrôles.
  4. Modifier la collection Tables pour DataSet1. Ajouter une nouvelle table nommée Table1.
  5. Modifier la collection Columns pour Table1. Ajouter une nouvelle colonne nommée Colonne1.
  6. Cliquez sur DataList1 et modifiez la propriété DataSource à DataSet1 .
  7. Cliquez avec le bouton droit sur DataList1 , pointez sur Modifier le modèle et puis cliquez sur modèles article . Faites glisser un contrôle DropDownList vers la section ItemTemplate .
  8. Cliquez sur DropDownList1 , puis ajouter cinq éléments à la collection Items. Définissez le texte et les propriétés valeur de ces éléments sur un , deux , trois , quatre et cinq respectivement.
  9. Définir la propriété AutoPostBack à cette propriété a la valeur true pour DropDownList1.
  10. Modifier la collection DataBindings de DropDownList1. Ajouter l'expression de liaison personnalisée suivante à la propriété SelectedIndex :
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Basculez en mode HTML. Définir l'attribut de suivi sur true dans la directive @ page comme suit :
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Ajouter le fichier code-behind

  1. Cliquez avec le bouton droit sur WebForm1.aspx, puis cliquez sur Afficher le code .
  2. Ajoutez le code suivant à l'événement 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. Créer une procédure Sub ci-dessous l'événement Page_Load pour gérer l'événement SelectedIndexChanged comme suit :
    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
    					
    « Dim objItem DataListItem en tant que » pour des chaque objItem dans DataList1.Items AddHandler CType(objItem.FindControl("DropDownList1"), _' DropDownList) .SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged ' Next End Sub

Exécuter l'exemple

  1. Exécution de la page. Remarquez que le contrôle DropDownList créé dynamiquement affiche état d'affichage dans les informations de suivi de l'arborescence de contrôle.

    Cela se produit car l'appel à la méthode DataBind crée dynamiquement le contrôle DropDownList , et vous associer le gestionnaire d'événements une fois que le DataBind appelez dans l'événement Page_Load . Car les contrôles ont un gestionnaire d'événements, état d'affichage Optimisation ne se déroule pas.
  2. Cliquez sur le bouton sur la page. Notez que de publication se produit et seulement le code dans l'événement Page_Load s'exécute. État d'affichage existe pour les contrôles DropDownList , car un gestionnaire d'événements est associée à la contrôle.
  3. Modifier la valeur d'un des contrôles DropDownList . Notez qu'une publication se produit. En outre, remarquer que ASP.NET déclenche l'événement Page_Load et exécute l'événement DropDownList1_SelectedIndexChanged .
  4. Dans l'événement DropDownList1_SelectedIndexChanged , appelez la méthode DataBind à nouveau pour créer des contrôles DropDownList .

    Parce que l'événement SelectedIndexChanged n'est pas associé à ces nouveaux contrôles DropDownList , ASP.NET utilise le mode État Optimisation et n'enregistre pas l'état d'affichage pour les nouveaux contrôles DropDownList .
  5. Examinez les informations suivi de l'arbre contrôle. Notez que les contrôles DropDownList n'ont pas l'état d'affichage.
  6. Cliquez sur le bouton sur la page. Notez que la publication se produit et notez que ASP.NET s'exécute l'événement Page_Load . Étant donné que vous associer l'événement SelectedIndexChanged pour les contrôles DropDownList , ASP.NET attend l'état d'affichage à associer avec les contrôles.

    Toutefois, parce que l'état d'affichage n'existe pas, ASP.NET déclenche l'événement SelectedIndexChanged , même si vous ne sélectionnez pas un élément.

Résolution

Pour résoudre ce problème, retirez commentaires le code de l'événement DropDownList1_SelectedIndexChanged pour associent les gestionnaires d'événements avec les nouveaux contrôles.

Propriétés

Numéro d'article: 314809 - Dernière mise à jour: lundi 3 mai 2004 - Version: 2.7
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Mots-clés : 
kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 314809
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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