代码之家  ›  专栏  ›  技术社区  ›  Eric

将网格视图写入Excel页

  •  0
  • Eric  · 技术社区  · 15 年前

    我得到以下错误

    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.
    

    我想把表格放在Excel中单击

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

    我有两个response.redirects,但是我把它们注释掉了,仍然得到了错误。以前有人见过这个错误吗?我做错什么了吗?

    我认为这与httpcontext.current.response.clear和httpcontext.current.response.addheader行有关

    2 回复  |  直到 15 年前
        1
  •  1
  •   Phaedrus    15 年前

    如果“导出到Excel”按钮位于更新面板内,则对response.write()的调用可能会导致“pageRequestManagerParserErrorException”。从更新面板中删除按钮或使用 PostBackTrigger .

    this 文章了解更多信息。

        2
  •  0
  •   madcolor    15 年前

    这应该有帮助。

    它更多的是读/写数据到Excel,而不是从GridView,但任何.NET程序员都应该能够做到。

    http://support.microsoft.com/kb/316934#10