2009-01-26 12 views
0

i ont un répéteur que crée une table:asp.NET: Comment accéder aux éléments générés par le répéteur?

<itemtemplate> 
    <tr id="theTableRow" runat="server"> 
     <td> 
     <asp:LinkButton runat="server" 
      OnClientClick="todo" 
      Text="Do Something" /> 
     </td> 
    </tr> 
</itemtemplate> 

Note: la ligne OnClientClick="todo".

Dans le code rendu définitif, je veux le todo pour contenir un appel à une fonction javascript, en passant:

  • l'ID de la ligne de table générée, et
  • la Eval d'une propriété de l'objet actuellement lié

Et maintenant pour une pseudo-code :

Pseudocode 1:

OnClientClick = "DoSomething (theTableRow, CromulentGuid); return false; "

pseudocode 2

OnClientClick =" javascript: DoSomething (theTableRow, CromulentGuid); return false; "

3 pseudocode

OnClientClick = "javascript: DoSomething (theTableRow, <% # Eval (" CromulentGuid")%>); return false; "

4 pseudocode

OnClientClick = "javascript: DoSomething (<% = theTableRow%>, <% # Eval (" CromulentGuid")%>); return false; »

pseudocode 5

OnClientClick = 'javascript: DoSomething (<% = Eval (theTableRow)%>, <% # Eval ("CromulentGuid")%>); return false;'

Quel que soit le code ASP.NET utilisé, je veux le rendu HTML soit:

<tr id="ctl00__itemRepeater_ctl01_theTableRow"> 
    <td> 
     <a 
      onclick="DoSomething('ctl00__itemRepeater_ctl01_theTableRow', '19a149db-5675-4eee-835d-3d78372ca6f9'); return false;" 
      href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')"> 
     Do Something 
     </a> 
    </td> 
</tr> 

Je serais aussi d'accord avec:

<tr id="ctl00__itemRepeater_ctl01_theTableRow"> 
    <td> 
     <a 
      onclick='DoSomething(&quot;ctl00__itemRepeater_ctl01_theTableRow&quot;, &quot;19a149db-5675-4eee-835d-3d78372ca6f9&quot;); return false;' 
      href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')"> 
     Do Something 
     </a> 
    </td> 
</tr> 

Note: Je suis d'accord avec la 2ème forme puisque je sais qu'elle est fonctionnellement identique, et le code ASP.NET ne peut pas générer le premier, même si ce dernier est moins lisible.


questions connexes:

ASP.NET: How to access repeater generated elements from javascript?

Répondre

0

Vous pouvez utiliser l'événement OnItemDataBound pour modifier chaque élément dans votre code. Puisque vous êtes particulier au sujet du HTML je pourrais également recommander d'utiliser des contrôles hybrides plutôt que des contrôles d'asp. Par exemple:

<itemtemplate> 
    <tr id="theTableRow" runat="server"> 
     <td> 
     <a runat="server" 
      onclick="todo(this.parent.parent, '<%# Eval("Property") %>');return false;" > 
      Do Something 
     </a> 
     </td> 
    </tr> 
</itemtemplate> 

C'est probablement pas 100% parfait, comme je l'ai tapé directement dans la fenêtre de réponse et je visse toujours la syntaxe Eval() sur mon premier rendez-vous, mais il devrait aider certains. Pourquoi ne pas mettre le JS sur la rangée de table?

0

<tr onClick="DoSomething(this, '<%# Eval("GUIDColumn") %>')"; ><td> 
<%# Eval("ColumnText") %> 
</td></tr> 

Cela vous donne une référence à la ligne du tableau et aux données dont vous avez besoin. Il décompose le support de bas niveau, donc les navigateurs sous IE6 ne fonctionneront pas comme prévu, mais c'est à peu près normal pour le cours ces jours-ci. Deux autres possibilités sont d'utiliser l'objet Datagrid/Gridview et les aspects OnItemDatabound ou de générer la table en code en utilisant le contrôle ASP.NET TABLE, et en itérant manuellement votre source de données.

+0

Parce qu'il y a d'autres éléments dans la cellule de la table en plus du lien un; ils ont été omis pour la clarté car ils sont irrelavent à la question. –

1

La meilleure solution est de put the presentation logic in the business layer:

Présentation:

<asp:LinkButton runat="server" 
    OnClientClick="<%# GetItemClientClick((MySomething)Container.DataItem) %>" 
    Text="Do stuff" /> 

affaires Logic

protected string GetItemClientClick(MySomething item) 
{ 
    ... 
    String szOnClientClick = 
     "return DeleteItem(this, "+ 
      Toolkit.QuotedStr(item.NodeGUID.ToString()) + ", "+ 
      Toolkit.QuotedStr(GetItemText(item))+");"; 

    return szOnClientClick; 
} 

propre Beaucoup. Beaucoup plus lisible. Beaucoup plus maintenable.

Questions connexes