PRB: ASP.NET desencadena eventos Change incluso si no cambia el valor del control

Seleccione idioma Seleccione idioma
Id. de artículo: 314809 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

En determinadas circunstancias, ASP.NET desencadena el Cambiar control de eventos para un Web de ASP.NET incluso si no cambie el control.

Causa

Algunos controles, como el evento SelectedIndexChanged en un control DropDownList o el evento TextChanged en un control TextBox , se basan en el registro del evento de cambio para utilizar el estado de vista. Encontrará este problema cuando crea dinámicamente estos controles después de que está enlazado el evento.

Cuando ASP.NET procesa la página al explorador, los controles creados dinámicamente no tienen un evento de cambio asociado. Ya no está presente ningún evento, ASP.NET no guarda el estado de vista. Esto se denomina optimización de estado de vista.

Cuando se devuelve la página y se enlazan los eventos, ASP.NET espera estado de vista pero encuentra que no existe ninguno. Esta diferencia desencadena el evento de cambio incluso si el control no se ha cambiado.

Solución

Asegúrese de que enlazar el evento Change para los controles creados dinámicamente antes de que ASP.NET representa la página. Esto garantiza que existe el estado de vista para el control.

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Crear el Web Form

  1. Cree una nueva aplicación de Visual Basic ASP.NET denominada ChangeFired.
  2. Abra WebForm1 en modo de diseñador. Arrastre un control DataList , un control Button y un control DataSet al formulario.
  3. En el cuadro de diálogo Agregar conjunto de datos , haga clic en el conjunto de datos sin tipo y, a continuación, haga clic en Aceptar . Mantener los nombres predeterminados para todos los controles.
  4. Modificar la colección Tables para DataSet1. Agregar una nueva tabla denominada Tabla1.
  5. Modificar la colección Columns para Tabla1. Agregar una nueva columna denominada Columna1.
  6. Haga clic en DataList1 y, a continuación, cambie la propiedad DataSource para DataSet1 .
  7. Haga clic con el botón secundario del mouse en DataList1 , seleccione Editar plantilla y, a continuación, haga clic en Plantillas de elementos . Arrastre un control DropDownList a la sección ItemTemplate .
  8. Haga clic en DropDownList1 y, a continuación, agregue cinco elementos a la colección Items. Establezca el texto de las propiedades y Value de estos elementos en una , dos , tres , cuatro y cinco respectivamente.
  9. Establezca la propiedad AutoPostBack en true para DropDownList1.
  10. Modificar la colección DataBindings para DropDownList1. Agregar la siguiente expresión de enlace personalizado a la propiedad SelectedIndex :
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Cambie a la vista HTML. Establezca el atributo de seguimiento en true en la directiva @ Page como sigue:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Agregar el archivo de código

  1. Haga clic con el botón secundario del mouse en WebForm1.aspx y, a continuación, haga clic en Ver código .
  2. Agregue el código siguiente al 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. Cree un nuevo procedimiento Sub debajo el evento Page_Load para controlar el evento SelectedIndexChanged como sigue:
    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
    					

Ejecutar el ejemplo

  1. Ejecute la página. Observe que los controles DropDownList creados dinámicamente contienen el estado de vista en la información de seguimiento para el árbol de control.

    Esto sucede porque la llamada al método DataBind crea dinámicamente los controles DropDownList y enlazar el controlador de eventos después de llamar a DataBind en el evento Page_Load . Dado que los controles tienen un controlador de eventos, estado de vista optimización no tiene lugar.
  2. Haga clic en el botón de la página. Observe que se produce una devolución y sólo el código dentro del evento Page_Load se ejecuta. Estado de vista existe para los controles DropDownList porque un controlador de eventos está asociado con el control.
  3. Cambie el valor de uno de los controles DropDownList . Observe que se produce una devolución de datos. Además, observe que ASP.NET desencadena el evento Page_Load y ejecuta el evento DropDownList1_SelectedIndexChanged .
  4. En el evento DropDownList1_SelectedIndexChanged , llame al método DataBind nuevo para crear nuevos controles de DropDownList .

    Porque no está enlazado el evento SelectedIndexChanged a estos nuevos controles de DropDownList , ASP.NET utiliza la optimización de estado de vista y no se guarda el estado de vista de los controles DropDownList nuevos.
  5. Revise la información seguimiento para el árbol de control. Observe que los controles DropDownList no tienen estado de vista.
  6. Haga clic en el botón de la página. Observe que se produce la devolución y observe que ASP.NET se ejecuta el evento Page_Load . Puesto que enlazar el evento SelectedIndexChanged a los controles DropDownList , ASP.NET espera estado de vista para asociarse con los controles.

    Sin embargo, porque el estado de vista no existe, ASP.NET desencadena el evento SelectedIndexChanged , aunque no se selecciona un elemento.

Resolución

Para resolver este problema, elimine el código del evento DropDownList1_SelectedIndexChanged para que los controladores de eventos enlazar con los controles recién creados.

Propiedades

Id. de artículo: 314809 - Última revisión: lunes, 03 de mayo de 2004 - Versión: 2.7
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palabras clave: 
kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 314809

Enviar comentarios

 

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