こんにちは。おしえてください;;
vb.net2003でweb開発をしています。
ボタンをクリックしたときにexcelのダウンロード処理を
行っているのですが、そのあと、テキストの初期化をしても
テキストの内容が消えずに困っています。
Private Sub btnDownLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpLoad.Click
Dim fi As FileInfo 'ファイル情報取得オブジェクト
Dim si As FileStream 'ダウンロードファイルストリーム
Response.ContentType = "Application/Vnd.MS-Excel"
Response.Buffer = True
Response.Clear()
flItem = New FileInfo("C:\temp\temp_sample.xls")
Dim Buffer(flItem.Length) As Byte
stItem = New FileStream("C:\temp\temp_sample.xls", FileMode.Open)
'StreamからBufferへ読み込む
si.Read(Buffer, 0, si.Length)
si.Close()
fi.Delete()
Response.AddHeader("Content-Disposition", "attachment; filename=" & HttpUtility.UrlEncode("sample.xls"))
Response.BinaryWrite(Buffer)
'メッセージクリア
Me.txtMsg.Text = String.Empty
'終了処理***
flItem = Nothing
End Sub
txtMsgをクリアしてるはずなのですが、どうしてもtxtMsgの内容が
残っています。
どなたか原因、対策ご教授願えないでしょうか?
'メッセージクリア
Me.txtMsg.Text = String.Empty
の後、
Sub Page_Load(・・・)
でブレークをかけて、ポストバックの結果と、その後の遷移を見たらいかがですか。
ありがとうございます。
ブレークポイントをはったのですが入ってきません。
Aspx側でonclickが何かをしていしないといけないのでしょうか?
とりあえず
Me.txtMsg.Text = String.Empty
以外を全てコメントアウトしたらどうなります?
ありがとうございます。
消したらテキストは初期化されました。
ページロード呼ばれます。
onclick側で対応しないことには無理です。
あくまで,HTTPのレスポンスはExcelデータなので,HTTPレスポンスに,プログラムで
Me.txtMsg.Text = String.Empty
をしたことは含まれません。
提示のコードだと ContentType が Excel になっているから
バインドされたテキストのHTML要素は、
出力された Excel ファイルの末尾に追記されてたりしませんかね。
なるほど,無駄にレスポンスに含まれているわけですね。
となると,Excelデータとしてもダメなんじゃ……。
テキストでない物を返したい場合は,Response.Endをちゃんと呼び出しましょう。
みなさんありがとうございます。
エクセルの中身は期待通りのものが入っています
Response.endをつけると、スレッドを中止しようとしました。というエラーがでます。
なんとかテキストを初期化する方法はないのでしょうか?
>エクセルの中身は期待通りのものが入っています
>Response.endをつけると、スレッドを中止しようとしました。というエラーがでます。
どのように確認されたかわかりませんがデータの書き込みを終えた時点で
Response.Endを呼ばないとバイナリの内容は保障できないように思います。
>なんとかテキストを初期化する方法はないのでしょうか?
代替案になりますがテキスト初期化後にClientScript.RegisterStartupScriptで
再度ポストバックまたはリダイレクトするスクリプトを登録し、
そちらのページで処理するとかはどうでしょうか。
ありがとうございます。
ClientScript.RegisterStartupScriptなんですが、
Me.txtMsg.Text = String.Empty
を実現するには具体的にどうすればよいのでしょうか?
いろいろ調べてみましたがピンとこないもので;;
一回の処理では1ページ分の出力(今回の場合はHTMLのページかエクセルのデータのどちらか一方)
しかできないから、単に処理を2回に分けたらどうかということです。
もしエクセルのダウンロードのみを行うページを別に用意してそのファイル名を
download.aspxとするなら、次のようなコードになるでしょう
Private Sub btnDownLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpLoad.Click
'メッセージクリア
Me.txtMsg.Text = String.Empty
ClientScript.RegisterStartupScript( _
Me.GetType(), "download", "<script type=""text/javascript"">location.href = ""download.aspx""</script>")
End Sub
ありがとうございます。
早速試してみます。
ところで、vb.net2003でClientScriptってあります?
ひょっとして2005からですかね?
RegisterStartupScriptというのはあるのですが別物でしょうか?
すみません、お返事遅くなりました。
RegisterStartupScriptでうまくいきました。
本当に助かりました。
ありがとうございます。