Scrivi gridview alla pagina Excel
-
06-07-2019 - |
Domanda
Ricevo il seguente errore
Error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Voglio mettere la griglia in Excel su clic
Sub bttntxtfile_Click(ByVal sender As Object, ByVal e As EventArgs)
GridViewExportUtil.Export("Customers.xls", GridView1)
End Sub
public class GridViewExportUtil
{
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/ms-excel";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
// 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());
}
}
}
/// <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).SelectedItem.Text));
}
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);
}
}
}
}
Ho due response.redirects ma li ho commentati e ho ancora ricevuto l'errore. Qualcuno ha mai visto questo errore prima? Sto facendo qualcosa di sbagliato?
Penso che abbia qualcosa a che fare con le linee httpcontext.current.response.clear e httpContext.current.response.addheader
Soluzione
Il "PageRequestManagerParserErrorException" può essere causato dalla chiamata a Response.Write () se il pulsante "Esporta in Excel" si trova all'interno di un pannello di aggiornamento. Rimuovere il pulsante dal pannello di aggiornamento o utilizzare un PostBackTrigger .
Vedi questo articolo per ulteriori informazioni.
Altri suggerimenti
Questo dovrebbe aiutare ..
Si tratta più di leggere / scrivere i dati per eccellere, che specificamente da una griglia, ma qualsiasi programmatore .net dovrebbe essere in grado di farlo.