网格视图分页。 "Download All" 只下载当前页面

Gridview pagination. "Download All" Only downloads current page

我有一个显示产品图片的网格视图:

<form id="form1" runat="server">
<asp:Button ID="btnDownload" runat="server" CssClass="dist-down-button" Text="Download Selected" OnClick="DownloadFiles" />
<asp:Button ID="Button1" runat="server" CssClass="dist-down-button" Text="Download All" OnClick="DownloadAll" />
<asp:GridView ID="GridView1" runat="server" CssClass="mydatagrid" PagerStyle-CssClass="pager" HeaderStyle-CssClass="header" RowStyle-CssClass="rows" AllowPaging="True" OnPageIndexChanging="datagrid_PageIndexChanging" AutoGenerateColumns="false" EmptyDataText="No files available">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" />
<asp:Label ID="lblFilePath" runat="server" Text='<%# Eval("Value") %>' Visible="false"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Text" HeaderText="Image Name" />
</Columns>
</asp:GridView>
</form>

绑定功能:(将产品文件夹中的所有文件与数据库中的产品图片列表匹配并显示匹配的产品)

protected void BindData()
{
    images = GetProductImages();
    string[] filePaths = Directory.GetFiles(Server.MapPath("~/upload/Products/"));
    List<ListItem> files = new List<ListItem>();
    foreach (string filePath in filePaths)
    {
        if (images.IndexOf(Path.GetFileName(filePath)) > -1)
        {
            files.Add(new ListItem(Path.GetFileName(filePath), filePath));
        }
    }
    GridView1.DataSource = files;
    GridView1.DataBind();
}
protected void datagrid_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    BindData();
}

下载所有功能:(查找gridview列表并下载列出的所有文件)

protected void DownloadAll(object sender, EventArgs e)
{
    using (ZipFile zip = new ZipFile())
    {
        zip.AlternateEncodingUsage = ZipOption.AsNecessary;
        zip.AddDirectoryByName(ProductUrl);
        foreach (GridViewRow row in GridView1.Rows)
        {
            string filePath = (row.FindControl("lblFilePath") as Label).Text;
            zip.AddFile(filePath, ProductUrl);
        }
        Response.Clear();
        Response.BufferOutput = false;
        string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        zip.Save(Response.OutputStream);
        Response.End();
    }
}

当我点击“全部下载”按钮时,它正在正确下载所有文件。 但是 在我添加分页后,现在所有下载都只下载当前页面。

注意:复选框用于选择下载功能。如您所见,我不是在寻找在 DownloadAll 函数中选中的复选框。

有谁知道为什么会发生这种情况,即使我没有在我的函数中寻找任何复选框?

您可以在导出前关闭分页并重新绑定 GridView:

protected void DownloadAll(object sender, EventArgs e)
{
    GridView1.AllowPaging = false;
    BindData();

    // ... your code

    GridView1.AllowPaging = true;
    BindData();
}

In Download All function, you have clearly writing that...take file path only from gridview.. After the pagination...so it only take Current Page Gridview data...not pickup all the data..

foreach (GridViewRow row in GridView1.Rows)
        {
            string filePath = (row.FindControl("lblFilePath") as Label).Text;
            zip.AddFile(filePath, ProductUrl);
        }

解法:-

So, Whenever you binding the Gridview that time hold all data in ViewState..

gridView.DataSource = dt;
gridView.DataBind();

ViewState["DownLoadGridData"]=dt as DataTable;

DataTable dt =  ViewState["DownLoadGridData"] as DataTable;

foreach (DataRow row in dt.Rows)
{
    foreach (DataColumn column in dt.Columns)
    {
        if (row[FilePath] != null) // This will check the null values also (if you want to check).
        {
               // then add filepath 
           string filePath = row[FilePath].ToString();
           zip.AddFile(filePath, ProductUrl);

        }
     }
}

注意:- 您也可以开发自己的逻辑