2010-03-05 5 views
20

J'ai un gridview avec plusieurs lignes, chacune a un bouton Update et j'ai besoin de passer 2 valeurs quand quelqu'un clique sur le bouton Update. En plus de placer les arguments dans CommandArgument séparés par des virgules (archaïque et pas élégant), comment passer plus d'un argument? En tant que note, les valeurs ne peuvent pas être récupérées à partir des contrôles sur la page, donc n'offrent pas de solutions de conception. S'il vous plaît, concentrez-vous sur la question posée. Merci d'avance.Passage de plusieurs arguments via CommandArgument of Button dans Asp.net

+7

La solution «archaïque» d'utilisation d'un délimiteur est parfois la plus simple. – Kelsey

+0

@sarsnake - j'accepterais la réponse de Archana Motagi – fubo

Répondre

13

Après avoir piqué, Kelsey a l'air correct. Il suffit d'utiliser une virgule ou quelque chose et de le diviser lorsque vous voulez le consommer.

+4

a trouvé ceci: http://aspdotnetcodebook.blogspot.com/2008/09/how-to-pass-multiple-values-to.html – sarsnake

1

Vous pouvez soit le stocker dans la collection gridview datakeys, soit le stocker dans un champ masqué dans la même cellule, soit joindre les valeurs ensemble. C'est la seule façon. Vous ne pouvez pas stocker deux valeurs dans un lien.

70

Vous pouvez passer des valeurs séparées par des points-virgules en tant qu'argument de commande, puis diviser la chaîne et l'utiliser.

<asp:TemplateField ShowHeader="false"> 
    <ItemTemplate> 
     <asp:LinkButton ID="lnkCustomize" Text="Customize" CommandName="Customize" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server"> 
     </asp:LinkButton> 
    </ItemTemplate> 
</asp:TemplateField> 

à côté serveur

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
     string[] arg = new string[2]; 
     arg = e.CommandArgument.ToString().Split(';'); 
     Session["IdTemplate"] = arg[0]; 
     Session["IdEntity"] = arg[1]; 
     Response.Redirect("Samplepage.aspx"); 
} 

Hope it helps !!!!

+0

Ce qui précède a fonctionné pour moi. Le seul problème est que vous manquez les paramètres dans le lien ASPX Redirect(). Essayez Response.Redirect ("Samplepage.aspx? IdTemplate =" + Session ["IdTemplate"]. ToString(). Trim() + "& IdEntity =" + Session ["IdEntity"]. ToString(). Trim()); – Fandango68

+0

En tant que pédant, vous n'avez pas besoin du .ToString(). CommandArgument est toujours une chaîne, donc: var argument = ((LinkButton) expéditeur) .CommandArgument.Split (';'); –

2

Un peu plus élégante de faire la même en ajoutant sur le commentaire ci-dessus ..

<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE" 
          AutoGenerateColumns="false" 
          OnRowDeleting="deleteRow" 
         GridLines="Vertical"> 
     <asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" /> 
     <asp:BoundField DataField="EntityId" HeaderText="EntityId" /> 
    <asp:TemplateField ShowHeader="false"> 
     <ItemTemplate> 
      <asp:LinkButton ID="lnkCustomize" Text="Delete" CommandName="Delete" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server"> 
      </asp:LinkButton> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </asp:GridView> 

Et sur le côté serveur:

protected void deleteRow(object sender, GridViewDeleteEventArgs e) 
{ 
    string IdTemplate= e.Values["IdTemplate"].ToString(); 
    string EntityId = e.Values["EntityId"].ToString(); 

    // Do stuff.. 
} 
+0

Cela ne fonctionne que si vous voulez que les champs IdTemplate et EntityId soient affichés dans votre grille. Les valeurs que vous placez dans CommandArgument ne sont jamais réellement utilisées. – cyberspy

5

Mon approche utilise la collection d'attributs pour ajouter Données HTML - attributs du code derrière. Ceci est plus en ligne avec jquery et les scripts côté client.

// This would likely be done with findControl in your grid OnItemCreated handler 
LinkButton targetBtn = new LinkButton(); 


// Add attributes 
targetBtn.Attributes.Add("data-{your data name here}", value.ToString()); 
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString()); 

ensuite récupérer les valeurs à travers la collection d'attributs

string val = targetBtn.Attributes["data-{your data name here}"].ToString(); 
11

@ La réponse de Patrick est une bonne idée, et mérite plus de crédit !. Vous pouvez avoir autant d'éléments de données que vous le souhaitez, ils sont tous séparés, et peuvent être utilisés côté client si nécessaire.

Ils peuvent également être ajoutés de manière déclarative plutôt que dans le code. Je viens de faire cela pour un GridView comme celui-ci:

<asp:TemplateField HeaderText="Remind"> 
    <ItemTemplate> 
    <asp:ImageButton ID="btnEmail" 
     data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>" 
     data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>" 
     CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" /> 
    </ItemTemplate> 
</asp:TemplateField> 

Dans le RowCommand, vous faites ceci:

donc beaucoup plus propre que le piratage toutes les valeurs avec délimiteurs et le déballage à nouveau à la fin. N'oubliez pas de tester/nettoyer toutes les données que vous récupérez de la page, au cas où il a été falsifié!

+1

J'aime cette approche, c'est aussi proche que vous obtiendrez d'avoir les éléments fortement typés, en utilisant des virgules et sous-chaîne pour séparer ce genre d'informations, bien que réalisable, peut devenir un gâchis. Vous devez avoir une connaissance inhérente de ce qu'est chaque partie de l'argument, l'utilisation de conteneurs "data-" est plus sûre et rend le code beaucoup plus lisible. – GJKH

0

Si vous voulez passer deux valeurs, vous pouvez utiliser cette approche

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server" 
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>' 
OnClick="RemoveFromRole_Click" /> 

Fondamentalement, je traite {CommmandName, CommandArgument} comme valeur de clé. Définissez les deux à partir du champ de base de données Vous devrez utiliser l'événement OnClick et utiliser l'événement OnCommand dans ce cas, ce qui, je pense, est plus propre.

Questions connexes