2011-06-18 16 views
0

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

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(); 
    } 
} 

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

しかし、これを別のGridViewのリンクボタンから呼び出すと、データを格納してエクスポートするための動的なグリッドビューを構築したいと思います。私がそれをすると、私はクラスのResponse.EndコールからThreadAbortExceptionを取得します。

質問1:UserControl内から同じコードを呼び出すと、ThreadAbortExceptionが発生しないのはなぜですか? usercontrolsは独自のスレッドやその他のコンテキストを取得しますか?

ThreadAbortExceptionが発生したときにエラーが発生すると、ApplicationInstance.CompleteRequest()で置き換えようとしました。私がそれを行うと、もはやThreadAbortExceptionが発生しなくなりましたが、これは以前の作業usercontrolを破りました - グリッドからのデータを含む結果として得られるExcelスプレッドシートの代わりに、それは含まれているページのHTMLを含み、そのエラーは空のキャッチで発生します。ただし、ダイナミックに生成されたGridViewでダイレクトコールを修正することはできません。そのコードはjavascriptエラーをレンダリングします。「サーバーから受信したメッセージを解析できませんでした」

私はここで正確に何が起こっているのか理解したいですが、私は理解に関係なく結果を必要とする時点にいます。私が試した他のアプローチ(GridViewの代わりにDataGridなど)は、同じ問題を抱えており、現在のレスポンスを に引き継ぎ、stringwriterとhtmlwriterを使用してデータをレンダリングすると、本質的に同じです。コンテンツタイプをExcelで返すそして、これは明らかに、ユーザーコントロールのコンテキストで動作するので、直接呼び出すときに私はそれが動作しません理由として、私のウィットの終わりにしています...

+0

[なぜ私のasp.netアプリケーションはThreadAbortExceptionをスローですか?](http://stackoverflow.com/questions/12476/why-is-my-asp-net-application-throwing-threadabortexception) –

+0

私はドンこれが重複しているとは思わない - これは、2つのシナリオを扱う非常に特殊なケースである - response.endへの呼び出しで発生するものと、それ以外のものである –

答えて

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); 
    } 
} 
0

が代わりにしてみてください。 HttpApplication.CompleteRequest() あたりとして:

http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx彼らはflishedされている追加のHTMLを議論

+0

CompleteRequestへの切り替えは、 "サーバーから受け取ったメッセージを解析できませんでした。"あなたのリンクからの上書きを追加しましたが、何の効果もありませんでした。 – Jarrod

+0

Fiddler(www.fiddler2.com)に戻って来るデータを見てください。あなたが期待していないレスポンスストリームに何かが書き込まれている可能性があり、出力とresponse.clearをバッファリングする必要がありますが、 –

+0

アダム、私は次回このような問題にぶつかることを覚えています。提案と入力に感謝します。私は問題の根本を見つけたので、解決策を掲載しました。再度、感謝します。 – Jarrod

0

利用代わりにあなたはdiv要素を使用することができますgridview1のこの

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() 
      dont forget to add this on your page 

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control) 
End Sub 
+0

Response.Charset = ""とResponse.Cache.SetCacheablility(HttpCacheability.NoCache)を除いて、これは私が持っているものと同じです。おそらく驚くべきことではないが、これらの行を追加しても効果はありませんでした。私はそれを抑制しない限り、私はThreadAbortExceptionを取得し、どちらの場合でも、 "サーバーから受信したメッセージを解析できませんでした"というjavascriptエラーが発生します。ページ内でVerifyRenderingInServerFormがオーバーライドされています。 – Jarrod

+0

ページクラスが定義されているaspxソースページの上にValidateRequest = "false"を追加しましたか? – Vikky

+0

いいえ、私はしませんでした。私はそれをするためにあなたが言及した場所を見ません。私はそれらのエラーを見つけることができ、私の答えを掲載しました。この問題に関するご意見ありがとうございます。とても有難い。 – Jarrod

0

コードをExcelにエクスポートが呼び出された場合、フルポストバックをしなければなりません。問題は、部分的なポストバックしかないためです。

私は同じエラーがあり、完全なポストバックをしたときに解決しました。

これは誰かを助けることを望みます。

関連する問題