Pregunta

Estoy usando jQuery para intentar activar un método cuando un ASP.NET (2.0) el evento de cambio de la lista desplegable es manejado por jQuery. El problema es que la lista desplegable se encuentra dentro de una vista de cuadrícula e incluso entonces solo cuando un usuario ha decidido editar una fila dentro de esa vista de cuadrícula.

Creo que tengo que recoger el objeto usando un bloque de código ASP, pero el problema es que cuando la página se carga por primera vez, el índice de edición de la fila no existe y arroja un error. Poner el bloque dentro de una instrucción IF tampoco funciona.

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

Es un intento que hice, y también intenté poner el código ASP de la declaración IF fuera del bloque JavaScript. Tampoco funciona.

¿Cómo podría aplicar el evento jQuery al cuadro desplegable? Idealmente lo más conciso posible.


Gracias por la respuesta, pero no, no funciona :(. Parece que el código JavaScript no se emite ... Confuso ...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

Es la salida. Aunque este es el código:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

También estaba haciendo eso antes, volviéndome LOCO.


Lo siento, ¿podrías aclararlo un poco? Intenté definir todo el código detrás de esta manera:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

¿Es eso lo que querías decir?

Por cierto, lo anterior no funcionó. Sin errores, simplemente no hay eventos trabajados.

¿Fue útil?

Solución

Un par de cosas aquí.

  1. Debe ajustar sus selectores entre comillas cuando los pase a la función $ () . El fragmento de código anterior genera algo como $ (# some-generate-id) , que no funcionará.
  2. La llave de cierre para el lado del servidor si la declaración estaba fuera de la función de preparación. Debe estar anidado al mismo nivel que la apertura si.

Pruebe este:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

Si no funciona, siga adelante y pegue el JavaScript generado también.

Otros consejos

Use esto:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

Es falso no crear las etiquetas de script ya que las está incluyendo. La documentación de MSDN es incorrecta en cómo explica la bandera.

Además, simplemente coloque la identificación del cliente de sus controles en variables separadas del código detrás, no el jQuery código.

Luego use las variables que contienen los identificadores en su lugar en el código jQuery.

Dentro del bloque de script que creas en el código detrás:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

No verifiqué esta sintaxis, pero debería estar cerca. Puede agregar la sintaxis adicional para grvTimeSheets.ClientID usted mismo. Si logra que esto funcione, es posible que desee cambiarlo para crear una matriz de JavaScript y almacenar los ClientId de esa manera, y luego solo tiene una variable global de JavaScript con la que necesita trabajar.

Otra opción es simplemente dar al elemento que está buscando un nombre de clase que describa su comportamiento. Entonces su código jQuery se vuelve realmente claro:

$(function() {
    $("select.yourMarkerClass").change(....);
});

Si no hay una fila de edición, entonces este código no hace nada. Si hay un elemento que coincide con el selector, se agregará el nuevo comportamiento.

Si no está utilizando el mismo ID en otra parte de la página, puede frustrar la ASP. ID único de NET con uno de los selectores avanzados de jQuery:

$('[id$=ddlClients]')

Esto coincide solo con el final de la cadena de identificación en lugar del conjunto. Tenga en cuenta que si el control está presente varias veces dentro de diferentes filas, esto coincidirá con todas las instancias.

Consulte Selectores para obtener más ejemplos.

Utilicé la Page.ClientScript propiedad para registrar un bloque de script que contenga cualquier ID al que necesite acceder con jQuery.

Aquí hay un ejemplo de mi JavaScript en un archivo externo:

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlId se define a partir del código subyacente y se registra en ClientScriptBlock.

La clave puede ser lo que quieras, aunque debería ser única.

Intentaré más después del fin de semana. Sin embargo, este era el código:

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);

Porque tienes un menú desplegable en cada fila. Cada menú desplegable tendrá un ClientId único, por lo que sugiero hacer lo que Ben sugirió y usar el selector de clase, ya que es la solución más simple.

O puede crear una función de JavaScript en su clic de edición y luego obtener la identificación única del cliente de su menú desplegable en la fila que se está editando.

Lo siento, debería haber leído tu código más de cerca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top