/// <summary>
/// 创建一个GridView并为其绑定数据
/// </summary>
/// <returns></returns>
protected GridView CreateGridView()
{
GridView gv = new GridView();
DataTable db=null;
BoundField boundField = null;
boundField = new BoundField();
boundField.DataField = "object_class";
boundField.HeaderText = "网元类型";
gv.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "version";
boundField.HeaderText = "版本信息";
gv.Columns.Add(boundField);
boundField = new BoundField();
boundField.DataField = "vendor_id";
boundField.HeaderText = "厂家";
gv.Columns.Add(boundField);
gv.AutoGenerateColumns = false;
db = (DataTable)ViewState["db"];
dv = db.DefaultView;
gv.DataBind();
return gv;
}
/// <summary>
/// 导出数据到EXCEL中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnDown_Click(object sender, EventArgs e)
{
//设置datagrid界面样式,即保存给excel的样式
string strFileName = "Version.xls";
GridView gv = CreateGridView();//创建一个GridView
gv.SelectedRowStyle.BackColor = Color.White;
gv.AlternatingRowStyle.BackColor = Color.White;
gv.RowStyle.BackColor = Color.White;
gv.HeaderStyle.BackColor = Color.Silver;
gv.HeaderStyle.ForeColor = Color.Black;
gv.BorderColor = Color.Black;
//保存数据到excel
Response.ContentType = "application/ms-excel";
Response.Charset = ""; //从Content-Type header中去除charset设置
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); //解决中文乱码之关键
Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName); //必要,做成下载文件
EnableViewState = false;
System.IO.StringWriter stwExcel = new System.IO.StringWriter();
HtmlTextWriter htwExcel = new System.Web.UI.HtmlTextWriter(stwExcel);
htwExcel.AddAttribute(HtmlTextWriterAttribute.Title, "charset=gb2312");
htwExcel.Write("<META>");
gv.RenderControl(htwExcel);
Response.Write(stwExcel.ToString());
Response.End();
htwExcel.Close();
stwExcel.Close();
}
说明:运行时发生““类型“GridView”的控件“gv”必须放在具有 runat=server 的窗体标记内。”的错误。
解决办法:在页面中重写Page基类的VerifyRenderingInServerForm方法
public override void VerifyRenderingInServerForm(Control control)
{
// Confirms that an HtmlForm control is rendered for
}
MSDN对该方法的解释如下:
必须位于 <form runat=server> 标记中的控件可以在呈现之前调用此方法,以便在控件被置于标记外时显示错误信息。发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法的重写中调用此方法。呈现服务器窗体元素的方式不同的页可以重写此方法以在不同的条件下引发异常。
如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误信息。
解决办法:直接在导出Execl的页面修改
<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true"
CodeFile="ExportGridView.aspx.cs" Inherits="ExportGridView" %>