Gidview нумерация страниц.«Загрузить все» Загружает только текущую страницу - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть сетка, отображающая изображения продуктов:

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

Функция «Загрузить все»: (найдите список в виде таблицы и загрузите все перечисленные файлы)

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.

Кто-нибудь знает, почему это происходит, хотя я не ищу никаких флажков в своей функции?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

В функции «Загрузить все» вы четко написали, что ... брать путь к файлу только из gridview ... После разбивки на страницы ... так что он принимает только данные текущей страницы Gridview ... не собирая все данные..

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

Решение: -

Итак, всякий раз, когда вы связываете Gridview, в это время все данные хранятся во 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);

        }
     }
}

Примечание: - вы также можете разработать свою собственную логику

1 голос
/ 20 сентября 2019

Вы можете отключить разбиение на страницы и повторно привязать GridView перед экспортом:

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

    // ... your code

    GridView1.AllowPaging = true;
    BindData();
}
...