Asp.net中的GridView导出遇到的两个问题和解决方法

 更新时间:2009年12月28日 00:28:28   作者:  
Asp.net下GridView导出遇到的两个问题与解决方法,需要的朋友可以参考一下。
对于GridView导出的内容的代码大致如下:
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.ContentType = "application/ms-excel";
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN", true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.grid1.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();
//grid1为表格的ID

注:蓝色标识代码为出错的那行代码。
OK,好不容易敲完代码,运行程序测试。蹬,报错了。
问题一:类型“Grid1”的控件“gvCompareDetail”必须放在具有 runat=server 的窗体标记内。
注:Grid1为表格的ID。

查找网上的解决大致为:
1)把Grid放到<form runat="server"></form>间。
2)给Grid加标记runat="server"。
查明前台Grid确实有加标记runat="server"的,而且表格是放在form中的。
解决方法:在后台代码加上以下重写方法
public override void VerifyRenderingInServerForm(Control control)
{ }
查找MSDN说明,该函数的作用在于:确认在运行时为指定的 ASP.NET 移动控件呈现 Form 控件。
语法:
C#
复制代码 代码如下:

public override void VerifyRenderingInServerForm(
    Control control
)

参数
control
类型:System.Web.UI..::.Control
必须位于 Form 控件中的 ASP.NET 移动控件。
备注
如果在运行时控件未包含在 Form 中,则此方法将重写 Page..::.VerifyRenderingInServerForm 方法以引发异常。
如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误信息。
开发自定义服务器控件时,通常在为任何类型的输入标记重写 Render 方法时调用该方法。这在输入控件调用 GetPostBackEventReference 或发出客户端脚本时尤其重要。复合服务器控件不需要作出此调用。
OK,加上以上的函数,编译运行调试。晕,又出现了别外一个错误。

问题二:只能在执行 Render() 的过程中调用 RegisterForEventValidation。

看样子,以上加的那个函数并没有彻底解决问题了。
经过一番搜索和尝试,终于把问题解决了。

解决方法1:把上面的函数VerifyRenderingInServerForm去掉,在导出代码中,动态添加一个Form对象,一个Page对象,把表格加入它,并把Form添加给Page。
导出的代码如下:
复制代码 代码如下:

Page p=new Page();
HtmlForm form=new HtmlForm();
Grid1.EnableViewState = false;
p.EnableEventValidation = false;
p.DesignerInitialize();
form.Controls.Add(Grid1);
p.Controls.Add(form);
StringBuilder sb=new StringBuilder();
StringWriter sw=new StringWriter(sb);
p.RenderControl(sw);
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
Response.Charset = "UTF-8";
Response.ContentEncoding = Encoding.Default;
Response.Write(sb.ToString());
Response.End();

解决方法2:修改web.config(不推荐)<pages enableEventValidation ="false" ></pages>

相关文章

  • CefSharp v62修改方法(支持.net4.0)

    CefSharp v62修改方法(支持.net4.0)

    下面小编就为大家分享一篇CefSharp v62修改方法(支持.net4.0),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • ASP.NET Core记录日志

    ASP.NET Core记录日志

    这篇文章介绍了ASP.NET Core记录日志的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • jsp和asp.net共享session值示例代码

    jsp和asp.net共享session值示例代码

    介绍ASP.NET中登录后,JSP可以用ASP.Net中的Session值,大家参考使用吧
    2013-12-12
  • asp.net下生成英文字符数字验证码的代码

    asp.net下生成英文字符数字验证码的代码

    用了asp.net随机数,获取指定位数的字母或数字以后,进行图片输出的验证码函数。
    2009-12-12
  • C#各种集合操作的性能总结

    C#各种集合操作的性能总结

    本文主要记录的是C#各种集合操作的性能,下面的标记说明描述标记的时间,下面的表格对比各种集合各种操作的时间,需要了解的朋友可以参考下
    2012-12-12
  • 客户端用JavaScript填充DropDownList控件 服务器端读不到值

    客户端用JavaScript填充DropDownList控件 服务器端读不到值

    今天遇到一个奇怪的问题,某一页面需要使用三级级联下拉列表框。为提高用户体验,采用jQuery的cascadingDropDown插件调用后台Web Services来实现ajax填充。
    2010-09-09
  • .net数据库连接池配置技巧(默认值)

    .net数据库连接池配置技巧(默认值)

    ado.net 本就有连接功能,所有.net开法基本不用去考虑连接问题,怪不得.net的连接池资料网上找不到。.net连接池只要在连接字符串里配制就可以了
    2008-12-12
  • .NET中创建对象的几种方式和对比

    .NET中创建对象的几种方式和对比

    在 .net 中,创建一个对象最简单的方法是直接使用 new (), 在实际的项目中可能还会用到反射,本文就介绍了几种创建方法,感兴趣的可以了解一下
    2021-07-07
  • ASP.NET堆和栈一之基本概念和值类型内存分配

    ASP.NET堆和栈一之基本概念和值类型内存分配

    这篇文章介绍了ASP.NET堆和栈的基本概念和值类型内存分配,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • ASP.Net项目中实现微信APP支付功能

    ASP.Net项目中实现微信APP支付功能

    这篇文章介绍了ASP.Net项目中实现微信APP支付功能的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论