http://blogs.wankuma.com/pinzolo/archive/2006/11/24/46804.aspxこれの DataGrid を GridView に変更して実行するとエラーになります。
原因は、GridView が VerifyRenderingInServerForm を呼び出していて、Form のレンダリング中に GridView のレンダリングが行われていないためです。
で、これを回避するためには VerifyRenderingInServerForm をオーバーライドしろとなっています。
で、いくつかの掲示板は blog では Page::VerifyRenderignInServerForm を中身空でオーバーライドしているコードが見受けられます。
これは非常に危険です。
VerifyRenderingInServerForm はメソッド名どおり、コントロールが HtmlForm 内に配置されレンダリングされていることを確かめます。
つまり、これを空でオーバーライドすると全てのコントロールが HtmlForm 外に配置されていても例外が出力されないということになります。
ダウンロードという一機能のために画面全体の ASP.NET のアーキテクチャに影響する変更をしてはなりません。
VerifyRenderingInServerForm を呼び出しているのは GridView だけではないのです。
せめて下記のようにするべきでしょう。
private bool _isDownloading = false;
public override void VerifyRenderingInServerForm(Control control)
{
if (!_isDownloading)
{
base.VerifyRenderingInServerForm(control);
}
}
protected void downloadButton_Click(object sender, EventArgs e)
{
base.Response.ContentType = "application/vnd.ms-excel";
base.Response.AppendHeader("content-disposition", "attachment;filename=hoge.xls");
using (HtmlTextWriter writer = new HtmlTextWriter(base.Response.Output))
{
try
{
_isDownloading = true;
this.GridView1.RenderControl(writer);
writer.Flush();
base.Response.End();
}
finally
{
writer.Close();
}
}
}