2009-04-02 8 views
0

Dans un masterpage J'ai un DataGrid standard:Checkbox en-tête Datagrid ClientID (JQuery)

<asp:DataGrid ID="dgMyGrid" runat="server" AutoGenerateColumns="false"> 
      <Columns> 
      <asp:TemplateColumn> 
      <HeaderTemplate> 
      <asp:CheckBox CssClass="Checker" ID="cbSelectAll" runat="server" /> 
      </HeaderTemplate> 
      <ItemTemplate> 
      <asp:CheckBox ID="cbSelect" runat="server" /> 
      </ItemTemplate> 
      </asp:TemplateColumn> 
      </Columns> 
    </asp:DataGrid> 

Demandez le jQuery suivant qui fait la case à cocher en-tête tout sélectionner:

$(document).ready(function() { 
$("#ctl00_ContentPlaceHolder1_dgMyGrid_ctl01_cbSelectAll").click(function() { 
$("#<%=dgID %> :checkbox").each(function(i) 
{ 
this.checked = $("#ctl00_ContentPlaceHolder1_dgMyGrid_ctl01_cbSelectAll").is(":checked") 
}); 
}); 
}); 

cela fonctionne, mais c'est un peu moche - je ne peux pas obtenir l'ID de client pour la case à cocher avec
<% = cbSelectAll.ClientID%> (comme je l'ai fait pour la grille de données) Probablement parce que le javascript est rendu avant ce contrôle. Y a-t-il un moyen plus élégant pour moi d'obtenir le clientID de ma case à cocher hors de la grille de données? Je pense que ce serait mieux si je n'ai pas hardcode le clientID comme ça. Toutes mes excuses si la réponse à cette question est évidente, c'est ma première journée à essayer jQuery! :)

Répondre

1

Ce code pour trouver votre case à cocher

protected static Control FindControl(Control control, string controlId) 
    { 
     Control result; 
     foreach (Control ctrl in control.Controls) 
     { 
      if (ctrl.ID == controlId) 
      { 
       result = ctrl; 
       return result; 
      } 
      if (ctrl.Controls.Count != 0) 
      { 
       result = FindControl(ctrl, controlId); 
       if (result != null) 
       { 
        return result; 
       } 
      } 
     } 
     return null; 
    } 

Et vous pouvez maintenant utiliser la page ASPX:

<%= FindControl(dgMyGrid, "cbSelectAll").ClientID%> 
+0

Merci pour cela, c'est la solution que j'ai fini par utiliser. Cela dit, j'aimerais voir une solution pour cela dans jQuery Alone, mais je vais marquer cela comme la réponse s'il n'y a pas d'autres réponses. – RYFN

1

Pourquoi ne pas simplement référencer la classe de la case à cocher 'cbSelectAll'.

<asp:CheckBox CssClass="Checker" ID="cbSelectAll" runat="server" /> 


$("#<%=dgID %> :checkbox").each(function(i) 
{ 
    this.checked = $(".Checker").is(":checked"); 
}); 

Si la classe 'Checker' est utilisée pour plusieurs contrôles, vous pouvez toujours assigner une classe unique.

<asp:CheckBox CssClass="Checker cbSelectAll" ID="cbSelectAll" runat="server" /> 

$("#<%=dgID %> :checkbox").each(function(i) 
{ 
    this.checked = $(".cbSelectAll").is(":checked"); 
}); 
+0

Malheureusement, cela ne marche pas semblent fonctionner - la sélection tous case ne devient jamais devient vérifié pour une raison quelconque. Bien que si je coche les autres cases, et que je clique sur le checkall, elles sont toutes désélectionnées, le contraire ne marche pas (testé IE8 et FF). – RYFN

+0

Peut-être est-ce parce que c'est dans la grille de données ... car c'est la fonctionnalité standard de jQuery je pense. – RYFN