2010-03-05 45 views
20

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 empaquetar los argumentos dentro de CommandArgument separados por comas (arcaico y no elegante), ¿cómo pasaría más de un argumento?Pasar múltiples argumentos a través de CommandArgument de Button en Asp.net

<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 se pueden recuperar de ningún control en la página, por lo que no ofrecemos ninguna solución de diseño. Por favor concéntrate en la pregunta hecha. Gracias por adelantado.

+7

La solución 'arcaica' de usar un delimitador a veces es la más fácil. – Kelsey

+0

@sarsnake - yo aceptaría la respuesta de Archana Motagi – fubo

Respuesta

13

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

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

+4

encontré esto: http://aspdnetcodebook.blogspot.com/2008/09/how-to-pass-multiple-values-to.html – sarsnake

1

O guárdelo en la colección gridview datakeys, 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.

70

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> 

del 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 que ayude !!!!

+0

Lo anterior funcionó para mí. El único problema es que le faltan los parámetros en el enlace Redirect() ASPX. Pruebe Response.Redirect ("Samplepage.aspx? IdTemplate =" + Session ["IdTemplate"]. ToString(). Trim() + "& IdEntity =" + Session ["IdEntity"]. ToString(). Trim()); – Fandango68

+0

Como pedante, no necesita .ToString(). CommandArgument es siempre una cadena, entonces: var argument = ((LinkButton) remitente) .CommandArgument.Split (';'); –

2

Un poco más elegante de hacer lo mismo en adición al 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.. 
} 
+0

Esto solo funciona si desea que los campos IdTemplate y EntityId se muestren en su cuadrícula. Los valores que coloca en CommandArgument nunca se usan realmente. – cyberspy

5

Mi enfoque está utilizando 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()); 

a continuación, recuperar los valores a través de la colección de atributos

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

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

<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 el RowCommand, esto se hace:

lo tanto mucho más limpia que la piratería todos los valores junto con los delimitadores y desembalaje de nuevo al final.

¡No olvide probar/limpiar cualquier dato que obtenga de la página, en caso de que haya sido alterado!

+1

Me gusta este enfoque, es lo más cercano que tendrá a los elementos fuertemente tipados, usar comas y subcadenas para separar este tipo de información, aunque factible, puede convertirse en un desastre. Necesita tener un conocimiento inherente de cada parte del argumento, usar contenedores de "datos" es más seguro y hace que el código sea mucho más legible. – GJKH

0

Si desea pasar dos valores, puede utilizar 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. Deberá usar el evento OnClick y usar el evento OnCommand en este caso, que creo que es un código más limpio.

Cuestiones relacionadas