欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-08 13:19:04
对于gridview导出的内容的代码大致如下: response.clear(); response.buffer = true; response.charset = "...
对于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>