【问题标题】:Gridview pagination. "Download All" Only downloads current page网格视图分页。 “全部下载”仅下载当前页面
【发布时间】:2020-01-21 00:15:45
【问题描述】:

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

<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();
}

Download All 功能:(查找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 函数中选中的复选框。

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

【问题讨论】:

    标签: c# asp.net gridview dotnetzip


    【解决方案1】:

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

    protected void DownloadAll(object sender, EventArgs e)
    {
        GridView1.AllowPaging = false;
        BindData();
    
        // ... your code
    
        GridView1.AllowPaging = true;
        BindData();
    }
    

    【讨论】:

    • 就这么简单。谢谢你。还有一个问题;由于 BindData() 被多次调用,这不会减慢应用程序的速度吗?绑定数据正在提取大量数据。
    • 这取决于您的数据...例如,网格视图有 100 条记录 ....那么它将需要更多...如果网格视图有 50 条记录,则与 100 条记录相比,它需要更少的时间记录s
    • 是的,每次导出网格时都必须重新绑定会有一些性能损失。请注意,每次更新页面时都会重新绑定 gridview。如果每次加载文件的顺序相同,您可以使用 Linq Skip(page * pageSize)Take(pageSize)。 @EvikGhazarian
    【解决方案2】:

    在全部下载功能中,您已经清楚地写了...取文件路径 仅来自gridview ..分页后...所以只需要Current 页面 Gridview 数据...没有拾取所有数据..

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

    解决方法:-

    所以,每当您绑定 Gridview 时,都会将所有数据保存在 视图状态..

    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);
    
            }
         }
    }
    

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

    【讨论】:

    • 感谢您的回答。我牢记未来问题的逻辑
    猜你喜欢
    • 2017-03-06
    • 2018-10-12
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多