テキストボックスが初期化されない

解決


みっち  2008-09-26 05:47:01  No: 145205

こんにちは。おしえてください;;
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の内容が
残っています。
どなたか原因、対策ご教授願えないでしょうか?


我龍院  2008-09-26 17:14:11  No: 145206

'メッセージクリア
Me.txtMsg.Text = String.Empty
の後、
Sub Page_Load(・・・)
でブレークをかけて、ポストバックの結果と、その後の遷移を見たらいかがですか。


みっち  2008-09-26 18:24:51  No: 145207

ありがとうございます。
ブレークポイントをはったのですが入ってきません。
Aspx側でonclickが何かをしていしないといけないのでしょうか?


我龍院  2008-09-26 18:56:03  No: 145208

とりあえず
 Me.txtMsg.Text = String.Empty
以外を全てコメントアウトしたらどうなります?


みっち  2008-09-26 19:10:39  No: 145209

ありがとうございます。
消したらテキストは初期化されました。
ページロード呼ばれます。


YuO  2008-09-26 19:37:35  No: 145210

onclick側で対応しないことには無理です。

あくまで,HTTPのレスポンスはExcelデータなので,HTTPレスポンスに,プログラムで
Me.txtMsg.Text = String.Empty
をしたことは含まれません。


subaru  2008-09-26 20:19:56  No: 145211

提示のコードだと ContentType が Excel になっているから
バインドされたテキストのHTML要素は、
出力された Excel ファイルの末尾に追記されてたりしませんかね。


YuO  2008-09-26 21:09:03  No: 145212

なるほど,無駄にレスポンスに含まれているわけですね。
となると,Excelデータとしてもダメなんじゃ……。

テキストでない物を返したい場合は,Response.Endをちゃんと呼び出しましょう。


みっち  2008-09-26 21:44:56  No: 145213

みなさんありがとうございます。
エクセルの中身は期待通りのものが入っています
Response.endをつけると、スレッドを中止しようとしました。というエラーがでます。
なんとかテキストを初期化する方法はないのでしょうか?


subaru  2008-09-27 00:44:04  No: 145214

>エクセルの中身は期待通りのものが入っています
>Response.endをつけると、スレッドを中止しようとしました。というエラーがでます。
どのように確認されたかわかりませんがデータの書き込みを終えた時点で
Response.Endを呼ばないとバイナリの内容は保障できないように思います。

>なんとかテキストを初期化する方法はないのでしょうか?
代替案になりますがテキスト初期化後にClientScript.RegisterStartupScriptで
再度ポストバックまたはリダイレクトするスクリプトを登録し、
そちらのページで処理するとかはどうでしょうか。


みっち  2008-09-27 15:22:04  No: 145215

ありがとうございます。
ClientScript.RegisterStartupScriptなんですが、
Me.txtMsg.Text = String.Empty
を実現するには具体的にどうすればよいのでしょうか?
いろいろ調べてみましたがピンとこないもので;;


subaru  2008-09-29 04:48:06  No: 145216

一回の処理では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


みっち  2008-09-29 07:00:58  No: 145217

ありがとうございます。
早速試してみます。

ところで、vb.net2003でClientScriptってあります?
ひょっとして2005からですかね?
RegisterStartupScriptというのはあるのですが別物でしょうか?


みっち  2008-10-08 00:16:22  No: 145218

すみません、お返事遅くなりました。

RegisterStartupScriptでうまくいきました。
本当に助かりました。
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加