0

私が見つけた Excel コードへの変換に問題があります。私は.NET 4.0でWebサイトプロジェクトに取り組んでおり、次のことを行うクラスを作成しました( http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.htmlに基づく):

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition",
string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) {
   using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
    //Create a table to contain the grid
    //Add header row
    //Add each data row
    //Add Footer row
    //Render the table into the htmlwriter
    //  render the htmlwriter into the response
    HttpContext.Current.Response.Write(sw.ToString());
    HttpContext.Current.Response.End();
  }
}

ページに表示される GridView に追加されるボタンを含むユーザー コントロールからこのクラスを呼び出します。これは期待どおりに機能します。ボタンをクリックすると、GridView からのデータを含む結果の Excel スプレッドシートを開くか保存するためのダウンロード オプションが表示されます。

ただし、別の GridView 内の linkbutton からこれを呼び出すと、動的なグリッドビューを作成してデータを格納し、それをエクスポートしたいと考えています。これを行うと、クラスの Response.End 呼び出しから ThreadAbortException が発生します。

質問 1: ユーザー コントロール内から同じコードを呼び出したときに ThreadAbortException が発生しないのはなぜですか? ユーザーコントロールは独自のスレッドまたはその他の種類のコンテキストを取得しますか?

その ThreadAbortException が発生したときに発生するエラーを検索すると、それを ApplicationInstance.CompleteRequest() に置き換えようとしました。これを行うと、ThreadAbortException を取得しなくなりましたが、これにより、以前に機能していたユーザーコントロールが壊れます。グリッドからのデータを含む結果の Excel スプレッドシートではなく、含まれているページの HTML が含まれており、とにかく簡単に抑制できます。空のキャッチでそのエラー。ただし、動的に生成された GridView を使用した直接呼び出しは修正されません。そのコードは、「サーバーから受信したメッセージを解析できませんでした」という JavaScript エラーをレンダリングします。

ここで何が起こっているのか正確に理解したいのですが、理解に関係なく結果が必要なところです。私が試した他のすべてのアプローチ(GridViewの代わりにデータグリッドなど)は同じ問題に遭遇し、現在の応答を「引き継ぎ」、stringwriterとhtmlwriterを使用してデータをExcel contentType で応答します。そして、これはユーザーコントロールのコンテキストで明らかに機能するため、直接呼び出されたときに機能しない理由について、私は機知に富んでいます...

4

4 に答える 4

0

代わりに試してください: http ://www.c6software.com/codesolutions/dotnet/threadabortexception.aspxに従ってHttpApplication.CompleteRequest()

彼らは、追加のhtmlが完成することについて話し合います

于 2011-06-18T06:12:35.613 に答える
0

これを使って

   Response.Clear()
    Response.AddHeader("content-disposition", atchment;filename=fm_specification.xls")
    Response.Charset = ""
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.ContentType = "application/vnd.xls"
    Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter
    Dim htmlwrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    GridView1.RenderControl(htmlwrite)
    Response.Write(stringWrite.ToString)
    Response.End()

gridview1 の代わりに div を使用できます

                            dont forget to add this on your page

 Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
 End Sub
于 2011-06-18T11:59:12.327 に答える
0

この問題は、実際には Excel エクスポートとはまったく関係がありませんでした。「…解析できませんでした」というエラーが鍵でした。これらのリンクから、グリッド イベントが部分的なポストバック イベントのみを引き起こすというキーを取得しました。

http://forums.asp.net/t/1392827.aspx

http://forums.aspfree.com/net-development-11/gridview-footer-template-button-in-updatepanel-not-posting-back-236087.html

これにより、ThreadAbortException と「解析できませんでした」というエラーが説明されます。これを ImageButton の OnPreRender に追加することが解決策でした:

protected void addTrigger_PreRender(object sender, EventArgs e)
{
    if (sender is ImageButton)
    {
        ImageButton imgBtn = (ImageButton)sender;
        ScriptManager ScriptMgr = (ScriptManager)this.FindControl("ScriptManager1");
        ScriptMgr.RegisterPostBackControl(ImgBtn);
    }
}
于 2011-06-22T18:41:14.330 に答える
0

Export to Excel コードが呼び出されるイベントは、完全なポストバックを作成する必要があります。問題は、部分的なポストバックのみを行うためです。

同じエラーが発生し、完全なポストバックを実行すると解決しました。

これが誰かに役立つことを願っています。

于 2014-07-18T04:52:15.923 に答える