ぽざうねっと

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  396  : 記事  0  : コメント  1030  : トラックバック  66

ニュース

さて、今年の秋は何を漬けようか

書庫

日記カテゴリ

Accessory

Community

Private

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();
        }
    }
}
投稿日時 : 2007年2月4日 17:26

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント: