60

ページにグリッド ビューがあり、それを Excel シートにエクスポートしたいです。以下は、このタスクを実行するために記述したコードです。ここでは、グリッドをバインドするメソッドにデータセットを既に渡していbtnExcelExportます。グリッド コンテンツを Excel シートにエクスポートします:-

private void BindGridView(DataSet ds)
{
    if (ds.Tables.Count > 0)
    {
        if (ds.Tables[0].Rows.Count > 0)
        {
            GVUserReport.DataSource = ds;
            GVUserReport.DataBind();
            btnExcelExport.Visible = true;
        }
    }
}

protected void btnExcelExport_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("content-disposition","attachment;filename=FileName.xls");
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/vnd.xls";
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    GVUserReport.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    return;
}

デバッグ中に、グリッドが正常にバインドされていることがわかりましたが、Excel にエクスポートしようとすると、次のエラーが発生します。

「Microsoft JScript ランタイム エラー: Sys.WebForms.PageRequestManagerParserErrorException: サーバーから受信したメッセージを解析できませんでした。」

4

9 に答える 9

141

この問題を修正しました。を使用しているので、ページのイベントにUpdatePanel以下のコードを追加したところ、うまくいきました。Page_Load

protected void Page_Load(object sender, EventArgs e) {
  ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
  scriptManager.RegisterPostBackControl(this.btnExcelExport);
  //Further code goes here....
}
于 2012-06-27T07:43:05.397 に答える
18

私の場合、問題はWeb サイトのマスター ページ(コード ビハインド) でのいくつかのResponse.Writeコマンドによって引き起こされました。それらはデバッグ目的でのみ存在していました (それは最善の方法ではありません)...

于 2014-02-25T11:54:36.577 に答える
6

1- Response.Write を使用しないでください。

2-(Page_Loadではなく)LinkBut​​tonを(動的に)作成した後、以下のコードを配置し、問題を解決しました:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(lblbtndoc1);
于 2015-05-06T20:53:58.583 に答える
4

同じエラーが発生したため、 AsyncPostBackTrigger<asp:PostBackTrigger ControlID="xyz"/>の代わりに試しました。これでうまくいきました。これは、部分的なポストバックが必要ないためです。

于 2014-05-19T05:59:56.280 に答える
3

これを PageLoad に追加すると、問題が解決します。

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(this.lblbtndoc1);
于 2013-02-06T12:27:38.817 に答える
1

これも私にとってはうまくいきましたが、追加がありました(以下)。

protected void Page_Load(object sender, EventArgs e) {
  ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
  scriptManager.RegisterPostBackControl(this.btnExcelExport);
  //Further code goes here....
}

イベントの処理が終了した後に別のボタンをクリックするために、ボタンにスクリプトを登録していました。それを機能させるには、更新パネルから他のボタンを削除する必要がありました (誰かが同じ問題に直面した場合に備えて)。

于 2016-07-20T14:03:06.077 に答える