Created
September 12, 2013 07:23
-
-
Save Krummelz/6533962 to your computer and use it in GitHub Desktop.
A utility class to export an ASP.NET GridView control with its contents to a CSV file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.IO; | |
using System.Web; | |
using System.Web.UI; | |
using System.Web.UI.WebControls; | |
/// <summary> | |
/// Exports a GridView with its contents to a CSV file | |
/// </summary> | |
public class GridViewExportUtil | |
{ | |
/// <summary> | |
/// | |
/// </summary> | |
/// <param name="fileName"></param> | |
/// <param name="gv"></param> | |
public static void Export(string fileName, GridView gv) | |
{ | |
HttpContext.Current.Response.Clear(); | |
HttpContext.Current.Response.AddHeader( | |
"content-disposition", string.Format("attachment; filename={0}", fileName)); | |
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; | |
using (StringWriter sw = new StringWriter()) | |
{ | |
using (HtmlTextWriter htw = new HtmlTextWriter(sw)) | |
{ | |
// Create a table to contain the grid | |
Table table = new Table(); | |
// include the gridline settings | |
table.GridLines = gv.GridLines; | |
// add the header row to the table | |
if (gv.HeaderRow != null) | |
{ | |
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); | |
table.Rows.Add(gv.HeaderRow); | |
} | |
// add each of the data rows to the table | |
foreach (GridViewRow row in gv.Rows) | |
{ | |
GridViewExportUtil.PrepareControlForExport(row); | |
table.Rows.Add(row); | |
} | |
// add the footer row to the table | |
if (gv.FooterRow != null) | |
{ | |
GridViewExportUtil.PrepareControlForExport(gv.FooterRow); | |
table.Rows.Add(gv.FooterRow); | |
} | |
// render the table into the htmlwriter | |
table.RenderControl(htw); | |
// render the htmlwriter into the response | |
HttpContext.Current.Response.Write(sw.ToString()); | |
HttpContext.Current.Response.End(); | |
} | |
} | |
} | |
/// <summary> | |
/// Replace any of the contained controls with literals | |
/// </summary> | |
/// <param name="control"></param> | |
private static void PrepareControlForExport(Control control) | |
{ | |
for (int i = 0; i < control.Controls.Count; i++) | |
{ | |
Control current = control.Controls[i]; | |
if (current is LinkButton) | |
{ | |
control.Controls.Remove(current); | |
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); | |
} | |
else if (current is ImageButton) | |
{ | |
control.Controls.Remove(current); | |
control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText)); | |
} | |
else if (current is HyperLink) | |
{ | |
control.Controls.Remove(current); | |
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text)); | |
} | |
else if (current is DropDownList) | |
{ | |
control.Controls.Remove(current); | |
control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedValue)); | |
} | |
else if (current is CheckBox) | |
{ | |
control.Controls.Remove(current); | |
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False")); | |
} | |
if (current.HasControls()) | |
{ | |
GridViewExportUtil.PrepareControlForExport(current); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment