Dimi Dimi - 3 months ago 9
ASP.NET (C#) Question

Download file and populate Grid in ASP.NET at the same time

I try to use a ASP.NET button event to do two things are


  1. Populate a Grid

  2. Download/Export a file



The code I have got sends the file with correct data but

A. Grid is not populated

B. There is an exception
Response.End();


Any clue how to fix it?

protected void ButtonExportCSV_Click(object sender, EventArgs e)
{
try
{
... Getting startDate, endDate
List<WorkOrder> result = GetWorkOders(startDate, endDate); // It populates Grid using GridViewWorkOrders.DataSource = result; GridViewWorkOrders.DataBind();

string csv = DataHelper.ToCsv(";", result);

var filename = "WorkOrders-ingresados-" + DateTime.Now.ToString("ddMMyyyy-HHmmsss");

Response.Clear();

Response.ContentType = "text/csv";
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename + ".csv");
Response.Write(csv);
Response.End(); // The exception occurs here
}
catch (Exception ex)
{

}
}


enter image description here

UPDATE #1

I could get rid of the exception replacing
Response.End()
with

HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client.
HttpContext.Current.Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client.
HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.


but anyway grid is not populated.

ANy clue if it is possible at all?

JAG JAG
Answer

ok. i think the the issue is

you are trying to send multiple Content-Type in single response which is not possible

  1. to populate Grid, server need to send html so the Content-Type: text/html

  2. to download a file Content-Type: text/csv

in your code you are overriding the text/html (which is default when GridView.DataBind() called) with text/csv

so the grid view html will be erased and csv content will be attached to response

alternate

first send GridView Bind response without the csv file

then once page loaded with new Grid, call a script function which calls a method in server to download csv file

Comments