parametros onrowcommand net ejemplos boton asp asp.net gridview commandargument

asp.net - onrowcommand - gridview asp net c# ejemplos



Pasar mĂșltiples argumentos a travĂ©s de CommandArgument de Button en Asp.net (7)

Tengo una vista de cuadrícula con varias filas, cada una tiene un botón Actualizar y necesito pasar 2 valores cuando alguien hace clic en el botón Actualizar. Además de agrupar los argumentos dentro de CommandArgument separados por comas (arcaicos y no elegantes), ¿cómo pasaría más de un argumento?

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

Como nota, los valores no pueden recuperarse de ningún control en la página, por lo tanto, no ofrezca ninguna solución de diseño. Por favor concéntrate en la pregunta hecha. Gracias por adelantado.


Después de hurgar, parece que Kelsey está en lo cierto.

Solo usa una coma o algo y divídelo cuando quieras consumirlo.


La respuesta de @ Patrick es una buena idea y merece más crédito. Puede tener tantos elementos de datos como desee, están todos separados y pueden usarse del lado del cliente si es necesario.

También se pueden agregar declarativamente en lugar de en código. Acabo de hacer esto para un GridView como este:

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

En RowCommand, haces esto:

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

Mucho más limpio que piratear todos los valores junto con delimitadores y desempaquetar nuevamente al final.

¡No olvide probar / limpiar cualquier información que obtenga de la página, en caso de que haya sido alterada!


Mi enfoque es usar la colección de atributos para agregar datos HTML, atributos del código subyacente. Esto es más en línea con jquery y scripts de cliente.

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

Luego recupera los valores a través de la colección de atributos

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


O guárdelo en la colección de claves de datos gridview, o guárdelo en un campo oculto dentro de la misma celda, o junte los valores. Esa es la única manera. No puede almacenar dos valores en un enlace.


Puede pasar valores separados por punto y coma como argumento de comando y luego dividir la cadena y usarla.

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

en el lado del servidor

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

¡¡¡¡Espero eso ayude!!!!


Si quiere pasar dos valores , puede usar este enfoque

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

Básicamente estoy tratando {CommmandName, CommandArgument} como valor clave. Establecer ambos desde el campo de la base de datos. Tendrá que usar el evento OnClick y usar el evento OnCommand en este caso, que creo que es un código más limpio.


Una forma un poco más elegante de hacer lo mismo agregando el comentario anterior.

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

Y en el lado del servidor:

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