Voici mon problème. J'ai un contrôle utilisateur qui va télécharger un fichier binaire (image, pdf, etc.) en utilisant un bouton de lien dans gridview.Comment télécharger le fichier image/pdf de la base de données en utilisant le linkbutton de Gridview?
<asp:GridView Visible="true" ID="GridView1" runat="server" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
RowStyle-BackColor="#A1DCF2" AlternatingRowStyle-BackColor="White" AlternatingRowStyle-ForeColor="#000"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID"/>
<asp:BoundField DataField="FileName" HeaderText="File Name"/>
<asp:TemplateField HeaderText="Action" ItemStyle-HorizontalAlign = "Center">
<ItemTemplate>
<asp:LinkButton ID="lnkDownload" runat="server" Text="Download" OnClick="DownloadFile" CommandArgument='<%# Eval("Id") %>'></asp:LinkButton>
<asp:LinkButton ID="lnkDelete" runat="server" Text="Delete" OnClick="DeleteFile" CommandArgument='<%# Eval("Id") %>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
code Derrière:
Protected Sub DownloadFile(sender As Object, e As EventArgs)
Dim id As Integer = Integer.Parse(TryCast(sender, LinkButton).CommandArgument)
Dim bytes As Byte()
Dim fileName As String, contentType As String
Using con As New SqlConnection(DataSource.ConnectionString)
Using cmd As New SqlCommand()
cmd.CommandText = "select FileName, PatImage, FileType from DB where [email protected]"
cmd.Parameters.AddWithValue("@Id", id)
cmd.Connection = con
con.Open()
Using sdr As SqlDataReader = cmd.ExecuteReader()
sdr.Read()
bytes = DirectCast(sdr("PatImage"), Byte())
contentType = sdr("FileType").ToString()
fileName = sdr("FileName").ToString()
End Using
con.Close()
End Using
End Using
Response.Clear()
Response.Buffer = True
Response.Charset = ""
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.ContentType = contentType
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName)
Response.BinaryWrite(bytes)
Response.Flush()
Response.End()
End Sub
Mais cela ne fonctionne pas si j'ai un UpdatePanel
dans ma page aspx parent. J'ai donc googlé et j'ai trouvé une réponse; cela consiste à placer un code dans RowDataBound:
Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
Dim lb As LinkButton = TryCast(e.Row.FindControl("lnkDownload"), LinkButton)
ScriptManager.GetCurrent(Me.Page).RegisterAsyncPostBackControl(lb)
End Sub
Et une nouvelle erreur s'est produite. C'est pourquoi je ne peux pas trouver mon linkButton dans mon GridView en utilisant mon code dans mon RowDataBound.
Donc j'ai encore googlé, et j'ai découvert que je devrais ajouter une propriété à ma page aspx ClientIDMode="AutoID"
. Mais cela ne fonctionne que sur le framework 4.x. Et je ne pouvais pas faire ça parce que je suis actuellement en utilisant 3.5. Y a-t-il des remèdes dans ma situation actuelle?
http://stackoverflow.com/questions/5232214/gridview-rowdatabound-access-data-items- vb – CristiC777
https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound%28v=vs.110%29.aspx – CristiC777
Avant que le contrôle GridView puisse être rendu, chaque ligne dans le contrôle doit être lié à un enregistrement dans la source de données. L'événement RowDataBound est déclenché lorsqu'une ligne de données (représentée par un objet GridViewRow) est liée à des données dans le contrôle GridView. Cela vous permet de fournir une méthode de gestion d'événements qui effectue une routine personnalisée, telle que la modification des valeurs des données liées à la ligne, chaque fois que cet événement se produit. – CristiC777