Click here to Skip to main content
15,891,184 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

DataList Inside update panel linkbutton is not downloading file.

Below is my code

ASP.NET
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Panel runat="server" ID="UpdatePanel1" ChildrenAsTriggers="false">
                <div style="vertical-align: middle; min-height: 480px;" class="pre-scrollable">
                    <div>
                        <asp:DataList ID="DataList2" runat="server" p Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" HorizontalAlign="Center" RepeatLayout="Table">
                            <ItemTemplate>
                             <div>
                                  <asp:Label ID="Label2" runat="server" Text='<%# Eval("FileName") %>'></asp:Label>
                                  <asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("ImagePath") %>' OnClick="DownloadFile"
                        CommandArgument='<%# Eval("Id")%>'></asp:LinkButton> 
                             </div>
                            </ItemTemplate>
                        </asp:DataList>
                    </div>
                </div>
            </asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>


VB
Dim fileName as String="D:\Image\1.jpg"
        Response.Clear()
        Response.Buffer = True
        Response.Charset = ""
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        'Response.ContentType = contentType
        Response.AppendHeader("Content-Disposition", Convert.ToString("attachment; filename=") & fileName)
        'Response.BinaryWrite(bytes)
        Response.Flush()
        Response.[End]()


What I have tried:

I added following code

ASP.NET
</ContentTemplate>
<Triggers>
    <asp:PostBackTrigger ControlID="LinkButton1" />
</Triggers>


But no success.

Thanks
Basit.
Posted
Updated 1-Aug-17 9:17am

Hi,

I tested your code and it shows me some errors.

Error 1: Two components with same name, updatepanel and pane component.
Error 2: The triggers show error (A control with the ID 'LinkButton1' was not found for the trigger in UpdatePanel 'UpdatePanel1').

SOLUTION

To fix error 1.
Rename one of them.

To fix error 2.
Remove the trigger component in your aspx and the onclick event of the linkbutton.
Add the ItemCreated event in the DataList
ASP.NET
<asp:DataList ID="DataList2" runat="server" p Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" HorizontalAlign="Center" RepeatLayout="Table" OnItemCreated="DataList2_ItemCreated">

In the code-behind, add the event to each row created in your DataList.
C#
C#
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                //Assigns the event to each radiobutton item
                ((LinkButton)e.Item.FindControl("LinkButton1")).Click += new System.EventHandler(DownloadFile);
            }

VB.NET
VB
If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
            'Assigns the event to each radiobutton item
            Dim link As LinkButton = e.Item.FindControl("LinkButton1")

            AddHandler link.Click, AddressOf DownloadFile

        End If

When you click the linkbutton, the event fire.

Here! The Complete code

ASPX CODE
HTML
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head><%@ Page Language="vb" AutoEventWireup="false" CodeBehind="frm_my_test1.aspx.vb" Inherits="vb_web_app_teste.frm_my_test1" %>


<body>
    <form id="form1" runat="server">
    <asp:scriptmanager runat="server"></asp:scriptmanager>
    <div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Panel runat="server" ID="Panel1" ChildrenAsTriggers="false">
                <div style="vertical-align: middle; min-height: 480px;" class="pre-scrollable">
                    <div>
                        <asp:DataList ID="DataList2" runat="server" OnItemCreated="DataList2_ItemCreated" Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" HorizontalAlign="Center" RepeatLayout="Table">
                            <ItemTemplate>
                             <div>
                                  <asp:Label ID="Label2" runat="server" Text='<%# Eval("FileName") %>'></asp:Label>
                                  <asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("ImagePath") %>'
                        CommandArgument='<%# Eval("Id")%>'></asp:LinkButton> 
                             </div>
                            </ItemTemplate>
                        </asp:DataList>
                    </div>
                </div>
            </asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>


CODE-BEHIND C#
C#
protected void DownloadFile(object sender, EventArgs e)
        {
            //your download code
            string localFilenameDestiny = @"D:\Image\1.jpg";
            using (WebClient client = new WebClient())
            {
                client.DownloadFile("http://your_domain_application/1.jpg", localFilenameDestiny);
            }
        }

        protected void DataList2_ItemCreated(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                //Assigns the event to each radiobutton item
                ((LinkButton)e.Item.FindControl("LinkButton1")).Click += new System.EventHandler(DownloadFile);
            }
        }


CODE-BEHIND VB.NET
VB
Imports System.Net
Public Class frm_my_test1
    Inherits System.Web.UI.Page


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim dt As New DataTable()


        dt.Columns.Add("Id")
        dt.Columns.Add("FileName")
        dt.Columns.Add("ImagePath")

        Dim dr As DataRow = dt.NewRow()
        dr("Id") = "1"
        dr("FileName") = "A"
        dr("ImagePath") = "Clique"
        dt.Rows.Add(dr)

        Me.DataList2.DataSource = dt
        Me.DataList2.DataBind()
    End Sub

    Protected Sub DownloadFile(ByVal sender As Object, ByVal e As EventArgs)
        Dim localFilename As String = "F:\1.png" 'path the destiny file
        Dim client As New WebClient()
        'localhost:50751. My local host. The image is in root the application 
        client.DownloadFile("http://localhost:50751/imginfo.png", localFilename)
    End Sub

    Protected Sub DataList2_ItemCreated(ByVal sender As Object, ByVal e As DataListItemEventArgs)

        If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
            'Assigns the event to each radiobutton item
            Dim link As LinkButton = e.Item.FindControl("LinkButton1")

            AddHandler link.Click, AddressOf DownloadFile

        End If

    End Sub

End Class
 
Share this answer
 
v11
Comments
basitsar 1-Aug-17 0:55am    
Many Thanks
Below is the code but no success.
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="Test.WebForm1" %>



<title>



<asp:ScriptManager ID="ScriptManager1" runat="server">


<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
<contenttemplate>
<asp:Panel runat="server" ID="Panel1" ChildrenAsTriggers="false">


<asp:DataList ID="DataList2" runat="server" p Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" HorizontalAlign="Center" RepeatLayout="Table" OnItemCreated="DataList2_ItemCreated">
<itemtemplate>

<asp:Label ID="Label2" runat="server" Text='<%# Eval("FileName") %>'>
<asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("ImagePath") %>' CommandArgument='<%# Eval("Id")%>'>












Sheila Pontes 1-Aug-17 7:56am    
Hi,
Test if the button is working.
To help you, I will change post above. I'll type the complete code in vb.
Copy this code and paste it into your test project and see how it works.
The declarative PostBackTrigger only works for a single control outside of a data-bound list. You're using a DataList, which means that there could be multiple copies of LinkButton1, so the declarative trigger will not work.

You'll need to register the trigger from the code-behind instead:
VB.NET
Protected Sub DataList2_ItemCreated(ByVal sender As Object, ByVal e As DataListItemEventArgs)
    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim btn As Control = e.Item.FindControl("LinkButton1")
        If btn IsNot Nothing Then
            ScriptManager.RegisterPostBackControl(btn)
        End If
    End If
End Sub
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900