[ASP.NET] GridView 轉 Excel

[ASP.NET] GridView 轉 Excel

在 ASP.NET 1.1 的時代要把 DataGrid 轉成 excel 檔案給USER大部分直接用下面的程式碼

//內容類型為Excel
Response.ContentType = "application/vnd.ms-excel"
//以Content-Type Header中去除Charset設置
Response.Charset = ""

//關閉ViewState
EnableViewState = false;
System.IO.StringWriter tw = new System.IO.StringWriter();//
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);//
//
//取的Control的HTML
dgExcel.RenderControl(hw);//
//把HTML寫回Browser
Response.Write(tw.ToString());
Response.End();

但在 ASP.NET 2.0 直接這樣使用會出現錯 (把 DataGrid  改成 GridView )
會出現錯誤畫面

為什麼會錯呢?
我也找了很久,到現在還沒辦法用言語形容為什麼要整個這樣做,指是就是要改成

//內容類型為Excel
Response.ContentType = "application/vnd.ms-excel"
//以Content-Type Header中去除Charset設置
Response.Charset = ""

//關閉ViewState
EnableViewState = false;
System.IO.StringWriter tw = new System.IO.StringWriter();//
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);//
//
//取的Control的HTML
gvData.RenderControl(hw);//
//把HTML寫回Browser
Response.Write(tw.ToString());
Response.End();

public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}

去覆寫這個事件,至於為什麼,就參考MSDN,等我悟道整各流程,再來補充解釋。
這樣 GridView 就能順利轉成 Excel 檔案出來。
http://msdn2.microsoft.com/zh-tw/library/system.web.ui.page.verifyrenderinginserverform(VS.80).aspx

備註

必須位在 <form runat=server> 標記以內的控制項,可以先呼叫這個方法,才進行呈現,這樣一來,如果控制項位在標記以外,便會顯示錯誤訊息。會回傳或是依賴已註冊指令碼區塊的控制項,應該呼叫這個方法來覆寫 Control.Render 方法。對於伺服器表單項目有不同呈現方法的網頁,可以覆寫這個方法以便在不同條件下擲回例外狀況。

會回傳或使用用戶端指令碼的伺服器控制項,如果未放在 HtmlForm 伺服器控制項 (<form runat="server">) 標記之內,將無法運作。這些控制項可以呼叫這個方法來呈現清楚的錯誤訊息 (當它們未被封入 HtmlForm 控制項時)。

當您開發自訂伺服器控制項時,通常會呼叫這個方法來覆寫任何類型的輸入標記之 Render 方法。這在輸入控制項呼叫 GetPostBackEventReference 或發出用戶端指令碼時特別重要。複合伺服器控制項並不需要做這個呼叫。