Response.AddHeader("content-disposition", "attachment;filename=CRM.xls") Response.Charset = "" Response.Cache.SetCacheability(HttpCacheability.NoCache) Response.ContentType = "application/vnd.xls" Dim stringWrite As StringWriter = New System.IO.StringWriter() Dim htmlWrite As HtmlTextWriter = New HtmlTextWriter(stringWrite) GridView1.RenderControl(htmlWrite) Response.Write(stringWrite.ToString()) Response.End()
結果報:類型“GridView”的控件“GridView1”必須放在具有 runat=server 的窗體標記內
但是奇怪的是,如果我把GridView改成用DataGrid,上面的代碼卻是能導出Excel文檔的。
那么是GridView和DataGrid之間的什么差別產生了這種情況?!
在頁面中重寫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 控件中時提供明確的錯誤信息。
開發自定義服務器控件時,通常在為任何類型的輸入標記重寫 Render 方法時調用該方法。這在輸入控件調用 GetPostBackEventReference 或發出客戶端腳本時尤其重要。復合服務器控件不需要作出此調用。
GridView默認用到ViewState所以需要runat=server
我猜是DataGrid不加分頁之類的功能默認是不用ViewState的