2015-09-21 2 views
0

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?

+0

http://stackoverflow.com/questions/5232214/gridview-rowdatabound-access-data-items- vb – CristiC777

+0

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound%28v=vs.110%29.aspx – CristiC777

+0

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

Répondre

0

A déjà trouvé une réponse, je viens de modifier le contenu de mon RowDataBound, reportez-vous au code:

Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     Dim LButton = CType(e.Row.FindControl("lnkDownload"), System.Web.UI.WebControls.LinkButton) 
     Dim scriptManager__1 = ToolkitScriptManager.GetCurrent(Me.Page) 
     If scriptManager__1 IsNot Nothing Then 
      scriptManager__1.RegisterPostBackControl(LButton) 
     End If 
    End If 
End Sub