Question

J'utilise jQuery pour essayer de déclencher une méthode lorsqu'un ASP.NET L'événement de modification de la liste déroulante (2.0) est géré par jQuery. Le problème est que la liste déroulante est située dans un gridview, même lorsqu'un utilisateur a décidé de modifier une ligne dans ce gridview.

Je pense que je l'ai récupéré en utilisant un bloc de code ASP, mais le problème est que lorsque la page charge pour la première fois l'index d'édition de la ligne, elle n'existe pas et génère une erreur. Placer le bloc dans une instruction IF ne fonctionne pas non plus.

$(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 }
        });
}
);
<% } %>

C’est une tentative que j’ai faite, et j’ai également essayé de placer le code ASP de la déclaration IF en dehors du bloc JavaScript. Cela ne marche pas non plus.

Comment appliquer l'événement jQuery à la liste déroulante? Idéalement aussi concis que possible.

Merci pour la réponse mais non, cela ne fonctionne pas :(. Le code JavaScript ne semble pas être sorti ... Déroutant ...

<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>

est la sortie. Même s’il s’agit du code:

<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>

Elle le faisait aussi auparavant, me rendant fou.

Désolé, pourriez-vous clarifier un peu la situation? J'ai essayé de définir la chose entière dans le code derrière comme suit:

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);
}

Est-ce ce que vous vouliez dire?

BTW, ce qui précède n'a pas fonctionné. Aucune erreur, aucun événement n'a fonctionné.

Était-ce utile?

La solution

Quelques choses ici.

  1. Vous devez mettre vos sélecteurs entre guillemets lorsque vous les passez à la fonction $ () . L'extrait de code ci-dessus génère quelque chose comme $ (# une-identité-générée) , qui ne fonctionnera pas.
  2. L'accolade fermante de votre côté serveur si l'instruction était en dehors de la fonction onready. Il doit être imbriqué au même niveau que l'ouverture if.

Essayez celui-ci:

$(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 cela ne fonctionne pas, continuez et collez également le javascript généré.

Autres conseils

Utilisez ceci:

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

Il est faux de ne pas créer les balises de script car vous les incluez. La documentation MSDN explique mal la façon dont elle explique le drapeau.

De même, il suffit de placer l’ID client de vos contrôles dans des variables distinctes du code précédent, et non dans le jQuery code.

Ensuite, utilisez les variables contenant les identifiants dans le code jQuery.

Dans votre bloc de script que vous créez dans le code derrière:

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

Je n'ai pas vérifié cette syntaxe, mais elle devrait être proche. Vous pouvez ajouter la syntaxe supplémentaire pour grvTimeSheets.ClientID vous-même. Si cela fonctionne, vous voudrez peut-être le modifier pour créer un tableau JavaScript et stocker le ClientId de cette façon. Vous ne disposerez alors que d'une seule variable JavaScript globale.

Une autre option consiste simplement à donner à l'élément recherché un nom de classe décrivant son comportement. Ensuite, votre code jQuery devient très clair:

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

S'il n'y a pas de ligne d'édition, alors ce code ne fait rien. Si un élément correspond au sélecteur, le nouveau comportement est ajouté.

Si vous n'utilisez pas le même identifiant ailleurs sur la page, vous pouvez déjouer les ASP. L'ID unique de NET avec l'un des sélecteurs avancés de jQuery:

$('[id$=ddlClients]')

Ceci correspond uniquement à la fin de la chaîne d'id plutôt qu'à la totalité. Notez que si le contrôle est présent plusieurs fois dans différentes lignes, cela correspond à toutes les instances.

Voir Sélecteurs pour plus d'exemples.

J'ai utilisé la Page.ClientScript propriété pour enregistrer un bloc de script contenant tous les identifiants auxquels j'ai besoin d'accéder avec jQuery.

Voici un exemple de mon code JavaScript dans un fichier externe:

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

myControlId est défini à partir du code situé derrière et enregistré dans le verrou ClientScript.

La clé peut être ce que vous voulez, mais elle devrait être unique.

Je vais essayer plus après le week-end. C'était le code, cependant:

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);

Parce que vous avez une liste déroulante dans chaque ligne. Chaque menu déroulant aura un unique ClientId. Je suggère donc de suivre ce que Ben a suggéré et d’utiliser le sélecteur de classe car c’est la solution la plus simple.

Vous pouvez également créer une fonction JavaScript lors de votre clic de modification, puis obtenir l'identifiant client unique de votre liste déroulante dans la ligne en cours de modification.

Désolé, j'aurais dû lire votre code de plus près.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top