2008-08-13 17 views
7

Aplicación ASP.NET simple.Ejecutando Javascript después de que el valor seleccionado del control se haya establecido

Tengo dos controles desplegables. En el primer desplegable tengo un evento JavaScript onChange. JavaScript habilita el segundo menú desplegable y elimina un valor del mismo (el valor seleccionado en el primer menú desplegable). Si hacen clic en el primer valor en blanco del menú desplegable, el segundo menú desplegable se desactivará (y las opciones se restablecerán).

También tengo un código en el método OnPreRender que habilitará o deshabilitará el segundo menú desplegable según el valor del primer menú desplegable. Esto es para que el valor de la primera lista desplegable se pueda seleccionar en el código (cargar la configuración del usuario).

Mi problema es:

  1. El usuario selecciona algo en el primer desplegable. El segundo menú desplegable se habilitará a través de JavaScript.
  2. Luego cambian un tercer menú desplegable que inicia una publicación posterior. Después de la publicación, los menús desplegables se encuentran en el estado correcto (primer valor seleccionado, segundo menú desplegable habilitado).
  3. Si luego hacen clic en el botón Atrás, el segundo menú desplegable ya no estará habilitado, aunque debería ser así porque hay algo seleccionado en el primer menú desplegable.

He intentado añadir un script de inicio (que se establezca el estado correcto de la segunda caída hacia abajo) a través ClientScript.RegisterStartupScript, sin embargo, cuando esto se llama el primer desplegable tiene un selectedIndex de 0, no lo que en realidad es. Supongo que el valor de la selección se establece después de mi script de inicio (pero aún no llama al script onChange).

¿Alguna idea sobre qué probar?

Respuesta

2
<%@ Page Language="C#" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server"> 
    protected void indexChanged(object sender, EventArgs e) 
    { 
     Label1.Text = " I did something! "; 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test Page</title> 
</head> 
<body> 
    <script type="text/javascript"> 
     function firstChanged() { 
      if(document.getElementById("firstSelect").selectedIndex != 0) 
       document.getElementById("secondSelect").disabled = false; 
      else 
       document.getElementById("secondSelect").disabled = true; 
     } 
    </script> 
    <form id="form1" runat="server"> 
    <div> 
     <select id="firstSelect" onchange="firstChanged()"> 
      <option value="0"></option> 
      <option value="1">One</option> 
      <option value="2">Two</option> 
      <option value="3">Three</option> 
     </select> 
     <select id="secondSelect" disabled="disabled"> 
      <option value="1">One</option> 
      <option value="2">Two</option> 
      <option value="3">Three</option> 
     </select> 
     <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server"> 
      <asp:ListItem Text="One" Value="1"></asp:ListItem> 
      <asp:ListItem Text="Two" Value="2"></asp:ListItem>  
     </asp:DropDownList> 
     <asp:Label ID="Label1" runat="server"></asp:Label> 
    </div> 
    </form> 
    <script type="text/javascript"> 
     window.onload = function() {firstChanged();} 
    </script> 
</body> 
</html> 

Editar: Reemplazó todo el código. Esto debería funcionar incluso en su control de usuario. Creo que Register.ClientScriptBlock no funciona porque el código que se escribe en ese bloque se ejecuta antes de llamar al window.onload. Y, supongo (no estoy seguro de este punto) que los objetos DOM no tienen sus valores establecidos en ese momento. Y, esta es la razón por la que obtiene selectedIndex como siempre 0.

3

Si el segundo menú desplegable se habilita inicialmente a través de javascript (supongo que esto es durante un cambio de javascript, ya que no especificó), al hacer clic en el botón Atrás para volver a cargar la devolución anterior nunca lo habilitará.

Mezclar ASP.NET con javascript clásico puede ser peludo. Es posible que desee echarle un vistazo a la implementación Ajax de ASP.NET (o al control AjaxPanel de terceros si se ve obligado a utilizar una versión anterior de ASP.NET). Esos le darán el comportamiento que desea a través de C# puro, sin forzarlo a recurrir a javascript hackery-pokery.

Cuestiones relacionadas