Tengo un DataList como este:

  1. <asp:DataList ID="DataList1" runat="server" DataSourceID="ObjectDataSource1" DataKeyField="idarticulo">
  2. <ItemTemplate>
  3.     <table>
  4.         <tr>
  5.             <td>
  6.                 <%# Eval("titulo") %>
  7.             </td>
  8.         </tr>
  9.         <tr>
  10.             <td>
  11.                 <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Download" CommandArgument="1"><%#Eval("aa1titulo")%></asp:LinkButton>
  12.                 <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Download" CommandArgument="2"><%#Eval("aa2titulo")%></asp:LinkButton>
  13.             </td>
  14.         </tr>                      
  15.     </table>    
  16. </ItemTemplate>
  17. </asp:DataList>

Nota:
aa1titulo y aa2titulo son títulos que guardo para mis archivos adjuntos 1 y 2.

La idea es que esos LinkButtons, al ser presionados, deben servir para que el usuario descargue unos archivos. En este ejemplo manejo dos archivos adjuntos para cada registro, por eso tengo dos LinkButtons.

Cuando se oprima alguno de esos LinkButtons, tengo que saber si se oprimió el primero o el segundo, para saber cuál de los dos archivos adjuntos enviar. También tengo que saber a cuál registro pertenece el LinkButton oprimido, para poder escoger el archivo adecuado.

Fíjate que a todos los LinkButtons les puse el CommandName establecido a Download. De esa manera voy a identificar que lo que se quiere hacer es una descarga. Ahora bien, a cada uno de ellos le establecí la propiedad CommandArgument a una distinta: 1 para el primer archivo adjunto y 2 para el segundo.

Con esto sabré si quieren descargar el primer archivo adjunto o el segundo. Ahora bien, suponiendo que en el DataList aparecerán n registros, ¿cómo voy a saber a cuál de los registros le hicieron clic en alguno de sus LinkButtons?

Nota que al DataList le he establecido la propiedad DataKeyField a idarticulo. Lo hice así porque la llave principal de mi tabla se llama idarticulo. Con esa llave encontraremos el registro al cual se le hizo clic.

Ok, ahora debes saber que el DataList tiene un evento que se llama ItemCommand, que se ejecuta precisamente cuando hagan clic en alguno de los LinkButtons. ¿Por qué? Porque les asigné la propiedad CommandName.

Entonces toda la operación la tenemos que hacer precisamente en ese evento, así:

  1. Protected Sub DataList1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles DataList1.ItemCommand
  2.         If e.CommandName = "Download" Then
  3.             EmpujaArchivo(Me, DataList1.DataKeys(CType(e.Item.ItemIndex, Integer)), e.CommandArgument)
  4.         End If
  5. End Sub

Nota:
La función EmpujaArchivo simplemente envía el archivo utilizando Page.Response.WriteFile. El primer parámetro es la página como tal (por eso le estamos pasando Me), el segundo parámetro es el artículo en el cual se encuentra el archivo adjunto solicitado, y el tercer parámetro es cuál de los archivos adjuntos (1 ó 2) se debe enviar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


9 − ocho =