Tengo un DataList como este:
- <asp:DataList ID="DataList1" runat="server" DataSourceID="ObjectDataSource1" DataKeyField="idarticulo">
- <ItemTemplate>
- <table>
- <tr>
- <td>
- <%# Eval("titulo") %>
- </td>
- </tr>
- <tr>
- <td>
- <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Download" CommandArgument="1"><%#Eval("aa1titulo")%></asp:LinkButton>
- <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Download" CommandArgument="2"><%#Eval("aa2titulo")%></asp:LinkButton>
- </td>
- </tr>
- </table>
- </ItemTemplate>
- </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í:
- Protected Sub DataList1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles DataList1.ItemCommand
- If e.CommandName = "Download" Then
- EmpujaArchivo(Me, DataList1.DataKeys(CType(e.Item.ItemIndex, Integer)), e.CommandArgument)
- End If
- 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.