Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.
Se connecter

Votre navigateur n’est pas pris en charge

Vous devez mettre à jour votre navigateur pour utiliser le site.

Mettre à jour vers la dernière version d’Internet Explorer

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

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
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 IfDim objItem As DataListItemFor 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 IfNext					
  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  'NextEnd 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.
état d'affichage

Avertissement : cet article a été traduit automatiquement

Propriétés

ID d'article : 314809 - Dernière mise à jour : 05/03/2004 23:53:02 - Révision : 2.7

  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtfr
Commentaires
ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");