Pregunta

Tengo un gridview con múltiples filas, cada una tiene un botón de actualización y tengo que pasar 2 valores cuando alguien hace clic en el botón Actualizar. Aparte de los argumentos de embalaje interior CommandArgument separados por comas (arcaico y no elegante), ¿cómo iba a pasar 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 se puede recuperar de cualquier controles de la página, así que estoy actualmente no buscar ninguna soluciones de diseño.

¿Fue útil?

Solución

Después de hurgar parece que Kelsey es correcta.

Sólo tiene que utilizar una coma o algo así, que se dividió cuando se quiere consumir.

Otros consejos

Puede pasar coma valores como argumento del comando separado y luego dividir la cadena y lo utilizan.

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

@ respuesta de Patrick es una idea buena, y merece más crédito !. Puede tener tantos elementos de datos como desee, todos ellos se separaron, y puede ser usada lado del cliente si es necesario.

Ellos también se puede añadir de forma declarativa en lugar de en el 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, hacer 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
    }
}

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

No se olvide de prueba / limpiar todos los datos que recibe de vuelta de la página, en caso de que ha sido manipulado!

Mi enfoque está utilizando los atributos de la colección para agregar HTML Data- atributos de detrás código. Esto es más en línea con jQuery y secuencias de comandos del lado del 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();

Una forma 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..
}

De cualquier tienda en la colección datakeys gridview, o almacenarlo en un campo oculto en el interior de la misma célula, o unirse a los valores. Esa es la única manera. No se puede almacenar dos valores en un enlace.

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 tanto desde el campo base de datos. Usted tendrá que utilizar OnClick evento evento y el uso OnCommand en este caso, que creo que es un código más limpio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top