2012-01-02 21 views
8

He siguiente código simple:primer elemento de lista desplegable no se dispara SelectedIndexChanged en absoluto

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testForm.aspx.cs" Inherits="Orbs.testForm" %> 
<html> 
<body> 
    <form id="form1" runat="server"> 
     <asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled"> 
      <asp:ListItem Value="1" Text="Item 1" /> 
      <asp:ListItem Value="2" Text="Item 2" /> 
      <asp:ListItem Value="3" Text="Item 3" /> 
      <asp:ListItem Value="4" Text="Item 4" /> 
      <asp:ListItem Value="5" Text="Item 5" /> 
     </asp:DropDownList> 
     <asp:Label runat="server" ID="label1"></asp:Label> 
    </form> 
</body> 
</html> 

Y este es mi código detrás

using System; 

namespace Orbs { 
    public partial class testForm: System.Web.UI.Page { 
     protected void Page_Load(object sender, EventArgs e) { 
      label1.Text = "???!!"; 
     } 

     protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e) { 
      label1.Text = "Fired on " + dropdown1.SelectedValue; 
     } 

    } 
} 

Cuando la primera vez que entrar en la página, label1 muestra '???!!'. Ahora selecciona un elemento del menú desplegable y label1 muestra el valor correcto, pero cuando selecciono primer elemento de menú desplegable, se muestra de nuevo en lugar de ???!!Fired on 1

Dónde estoy haciendo mal?

Editar: Me di cuenta que si agrego Selected="True" a cualquiera de los elementos en el menú desplegable, ese elemento se convierte en víctima y no activará el evento.

+0

Ohhh, lo siento ¿puedes ver el punto de quiebre en el evento? – IamStalker

+0

No, no está disparando cuando estoy seleccionando el primer elemento. Seleccionar el resto de los elementos lo activará – AaA

+0

, así que no creo que el índice haya cambiado cuando está seleccionando el primer elemento, ya que en realidad es el mismo índice en el que está cargado – V4Vendetta

Respuesta

3

He resuelto el problema por mí mismo,

He leído en alguna parte que apagar el ViewStateMode causará DropDownList no funcionar correctamente. En mi aplicación web tuve que desactivar ViewStateMode para realizar alguna tarea global y activarla caso por caso.

girando alguna manera en ViewStateMode en DropDownList no está funcionando, incluso intenté encender ViewStateMode de página y página maestra, pero aún DropDownList no funcionó. solo funcionó cuando encendí ViewStateMode en web.config.

Como activar ViewStateMode en web.config no es una opción, encontré una solución alternativa. Lo incluyo aquí esperando que ayude a alguien.

  • Agregue HiddenField a su formulario.
  • En Page_Load comparar el valor de HiddenField con Request.Forms[DropDownList1.UniqueID]
  • si son diferentes, llame SelectedIndexChanged manualmente
  • Establecer el valor de HiddenField al valor de Request.Forms[DropDownList1.UniqueID].
+3

Solo para dar seguimiento a esto. Puse ViewStateMode = Enabled en el control desplegable y eso resolvió el problema. Quizás algo ha cambiado de aquí a entonces. – Edyn

+0

Si comprueba mi código de muestra, 'ViewStateMode = Enabled' ya está allí, pero lo deshabilité en' web.config' y no funcionó – AaA

+0

Poniendo el ViewStateMode = Enabled en el control desplegable funcionó para mí también. – Kayes

0

Esto está sucediendo porque está estableciendo la etiqueta a "??? !!" cada evento de página.

Debe modificar la carga de la página para detectar que no se haya producido una devolución de datos.

protected void Page_Load(object sender, EventArgs e) { 
     if(!IsPostBack) 
     { 
      label1.Text = "???!!"; 
     } 
    } 
+0

Ya tuve la misma respuesta exacta de otra persona que eliminó su comentario. si elimino la línea de 'Page_Load', aún el evento' dropdown1_SelectedIndexChanged' no se activará y la etiqueta permanecerá vacía – AaA

1

tenían el mismo problema - SelectedIndexChanged no se dispara cuando se selecciona la primera opción, Mi solución no estaba limpia (no estoy seguro de que era tan inteligente, pero funciona para mí),

Al Load I agregado el guión siguiente:

if (!IsPostBack) 
     { 

      //bind data first time 
     } 
     else 
     { 
      int ddlSortByValue = int.Parse(ddlSortBy.SelectedValue); 
      if (ddlSortByValue == 0) 
      { 
       ddlSortBy_SelectedIndexChanged(this, EventArgs.Empty); 
      } 

     } 

de esa manera fuerzo al evento SelectedIndexChanged para encender

+0

Su solución funciona solo si su primer elemento del menú desplegable es el elemento seleccionado (si se selecciona otro elemento de la lista no funcionará) y sus valores deben ser números (no funcionará si sus valores son cadenas) – AaA

13

para cualquier persona que todavía tiene el problema; Lo resolví de una manera diferente pero más fácil: Simplemente agregue un ListItem ficticio al inicio de DropDownList y establezca la propiedad Enabled de ese elemento en false. decir

<asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled"> 
     <asp:ListItem Value="" Text="" Enabled="false" /> 
     <asp:ListItem Value="1" Text="Item 1" /> 
     <asp:ListItem Value="2" Text="Item 2" /> 
     <asp:ListItem Value="3" Text="Item 3" /> 
     <asp:ListItem Value="4" Text="Item 4" /> 
     <asp:ListItem Value="5" Text="Item 5" /> 
    </asp:DropDownList> 
+0

Esto debería sea ​​la respuesta correcta – Eddy

1

Esta pregunta abarca todas las posibilidades mejores que otros mensajes por ahí, así que estoy añadiendo esta respuesta explícita. En mi caso el comentario de @ Edyn funcionó, aunque el problema original ya tiene esto:

Establezca ViewStateMode="Enabled" en el control desplegable.
También lo configuro en la declaración de página en la parte superior de la página, por las dudas.

Esto es .Net 4.0, por lo que tal vez algo ha cambiado (pero ciertamente no se ha solucionado correctamente).

1

que tenían el mismo problema, pero lo resolvió llamando onindexchanged función manualmente, así:

ddl_SelectedIndexChanged(null, null); 

Sé que esto puede no ser la manera perfecta pero está trabajando para mí.

+0

si llama a SelectedIndexChanged manualmente, su método se ejecutará dos veces si el usuario selecciona elementos que no sean el primero. – AaA

0

En mi caso, esto sucedió porque me había referido a ese menú desplegable utilizando una variable de lista desplegable local y descarté esa variable al final de una función. Estaba agregando el primer elemento a la lista desplegable después de establecer un origen de datos. Me tomó 2 horas encontrar esto, y funcionó perfectamente después de que eliminé la llamada a disponer.

Cuestiones relacionadas