Question

J'ai un gridview avec plusieurs lignes, chacun a un bouton de mise à jour et je dois passer 2 valeurs lorsque quelqu'un clique sur le bouton de mise à jour. En dehors de l'emballage des arguments à l'intérieur CommandArgument séparés par des virgules (archaïques et non élégant), comment pourrais-je passer plus d'un argument?

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

Comme une note, les valeurs ne peuvent être récupérées à partir des contrôles sur la page, donc je ne suis pas actuellement des solutions cherchent conception.

Était-ce utile?

La solution

Après farfouillé il semble que Kelsey est correct.

Il suffit d'utiliser une virgule ou quelque chose et de diviser quand vous voulez consommer.

Autres conseils

Vous pouvez transmettre des valeurs séparées virgule comme argument de commande, puis diviser la chaîne et de 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");
}

it helps !!!!

@ 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 voulez, ils sont tous séparés, et peuvent être utilisés côté client si nécessaire.

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

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

void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        var btnSender = (ImageButton)e.CommandSource;
        var riderName = btnSender.Attributes["data-rider-name"];
        var riderEmail = btnSender.Attributes["data-rider-email"];
        // Do something here
    }
}

beaucoup plus propre que le piratage toutes les valeurs avec délimiteurs et le déballage à nouveau à la fin.

Ne pas oublier de tester / nettoyer les données que vous revenez de la page, dans le cas où il a été trafiqué!

Mon approche utilise la collection des attributs d'ajouter des attributs HTML Data- de code sous-jacent. 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();

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 du côté du serveur:

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

   // Do stuff..
}

Soit la stocker dans la collection gridview DataKeys, ou la stocker dans un champ caché à l'intérieur de la même cellule, ou se joindre aux valeurs. C'est la seule façon. Vous ne pouvez pas stocker deux valeurs dans un lien.

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

En fait je traite {CommmandName, CommandArgument} comme valeur de clé. Définir à la fois du champ de base de données. Vous devrez utiliser événement OnClick et utiliser événement OnCommand dans ce cas, que je pense est un code plus propre.

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