QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

【ASP.NET(VB.NET)】テキストボックス内の文字列をcsv出力したい

プログラミング超初心者です。
こんな質問を書き込みしてよいものか悩みましたが
調べてもわからなかったので質問させてください。

やりたいことは、ボタンクリック時にテキストボックスの中に書かれている文字列を
CSV形式で出力することです。
そして、ボタンをクリックした後は別のページに飛びたいのです。

ボタンをクリックし、CSV形式のファイルをダウンロードするやり方ではなく
あくまでクライアント側では「ボタンを押しただけ」にし
サーバー側(?)でCSV形式のファイルを生成したいのです。

言葉足らずですみません。
ご教授頂ければ幸いです(>_<)
よろしくお願いします。

下記は、ダウンロードするやり方、かつCSV形式ではありません…
(今できる精一杯でした;)
'***************************************************************
' Function Name : cmdSent_Click
' Outline : 送信ボタン押下時の処理
'***************************************************************
Sub cmdSent_Click(sender As Object, e As EventArgs)

Response.ContentType = "application/octet-stream"

    Response.Write( lblQ1AnsImp.Text & "," )
    Response.Write( lblQ2AnsImp.Text & "," )
    Response.Write( lblQ3AnsImp.Text & "," )
    Response.Write( lblQ4AnsImp.Text & "," )
    Response.Write( lblQ5AnsImp.Text )

Response.End()

Server.Transfer( "Fin.aspx" )

End Sub
'***************************************************************

質問者:ひな

回答

ひなさんの書き込み (2005-07-05 14:52) より:

やりたいことは、ボタンクリック時にテキストボックスの中に書かれている文字列を

CSV形式で出力することです。

そして、ボタンをクリックした後は別のページに飛びたいのです。

ボタンをクリックし、CSV形式のファイルをダウンロードするやり方ではなく

あくまでクライアント側では「ボタンを押しただけ」にし

サーバー側(?)でCSV形式のファイルを生成したいのです。

言葉足らずですみません。

ご教授頂ければ幸いです(>_<)

よろしくお願いします。

#相変わらず回答では有りません(すいません)

まず、ご自身の行いたいことを整理してみましょう。
1.画面でボタンを押下されたときに、画面項目から値を取得したい。
2.取得した値を使ってCSVファイルを作りたい。
3.作成したCSVファイルは。
  3−1.クライアントにダウンロードしたい。
  3−2.サーバ側に保存したい。
4.画面遷移を行いたい。

ということですかね?個別に調べれば分るような。

投稿者:餅宮餅吉

編集 履歴 (0)

手元に環境が無いので実験・確認等できません。
勘違いしているかも知れませんのでご了承を。

お困りの箇所が、
1.Response.Writeを使用して、CSV出力をする。
2.出力後に、Server.Transferでページ遷移する。
これをセットでやろうとした場合に、
期待した動作にならないということでしたら。

Server.Transferは、現在のPage処理を中断(threadAbort)して
次Page(Fin.aspx)を生成し、処理結果をクライアントに返すものです。
ですので、この処理過程中にResponse.Writeした結果は
クライアントに届かないような気がします。(思いっきり想像)
Flushしたら届くかもですが。。

私が実装するとしたら、
遷移前に、出力したいデータをあらかじめセットしておき、
次のPage処理で取得してからCSV出力します。
データのセット/取得は、SessionとかContextHandlerを使います。
画面遷移先が決まっていないと、面倒そうですけど。

投稿者:葉瀬崎浩樹

編集 履歴 (0)

餅宮餅喜さん、葉瀬崎浩樹さん。
ありがとうございます。

1.画面でボタンを押下されたときに、画面項目から値を取得したい。
→これはできます。

2.取得した値を使ってCSVファイルを作りたいので
→値ごとを","で区切って連結しました。
→連結したものを変数に入れときます。

3.テキストファイルを作成し、2を書き込み、テキストファイルを閉じ、
4.画面遷移を行いたい。(遷移先は決まっています)

といった感じです。
テキストファイルへの出力と画面遷移は同時に行えないのでしょうか…

葉瀬崎浩樹さんの、

遷移前に、出力したいデータをあらかじめセットしておき、
次のPage処理で取得してからCSV出力します。
というのは、次ページに移った時に出力するってことでしょうか?

うう、きっとすごい初歩なんだろうなぁ。スミマセン(>_<)

投稿者:ひな

編集 履歴 (0)

テキストファイルへの出力と画面遷移は同時に行えないのでしょうか…

葉瀬崎浩樹さんの、

遷移前に、出力したいデータをあらかじめセットしておき、

次のPage処理で取得してからCSV出力します。

というのは、次ページに移った時に出力するってことでしょうか?

はい、次ページで出すようにしたら堅いという話でした。
もちろん、Response.Writeしつつ、Server.Transferが上手くいくのであれば、
そんな小細工する必要はありません。処理の流れが不透明になるだけですし。
(想像で読み進めたため、混乱させちゃいましたね)

その前に、餅宮餅喜さんにまとめて頂いたように、
1つずつの処理を確実にしていくことですねー!

投稿者:葉瀬崎浩樹

編集 履歴 (0)

葉瀬崎浩樹さんの書き込み (2005-07-05 16:22) より:

Server.Transferは、現在のPage処理を中断(threadAbort)して

次Page(Fin.aspx)を生成し、処理結果をクライアントに返すものです。

ですので、この処理過程中にResponse.Writeした結果は

クライアントに届かないような気がします。(思いっきり想像)

Flushしたら届くかもですが。。

ここだけ。
違います。
Response.Endしているので、Server.Transferが実行される事はありません。
_________________「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/

投稿者:NAL-6295

編集 履歴 (0)

ひなさんの書き込み (2005-07-05 16:59) より:

3.テキストファイルを作成し、2を書き込み、テキストファイルを閉じ、

4.画面遷移を行いたい。(遷移先は決まっています)

クライアントにCSVファイルをダウンロードするわけではなく、サーバで作成するだけであれば、System.IO名前空間以下のクラスを利用してファイル作成すればよいと思います。
勿論、作成しようとしているフォルダに対する権限等も考慮してください。
で、その後に画面遷移をすればよいです。
_________________「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/

投稿者:NAL-6295

編集 履歴 (0)

ひなさんの書き込み (2005-07-05 16:59) より:

3.テキストファイルを作成し、2を書き込み、テキストファイルを閉じ、

4.画面遷移を行いたい。(遷移先は決まっています)

といった感じです。

テキストファイルへの出力と画面遷移は同時に行えないのでしょうか…

葉瀬崎浩樹さんの、

遷移前に、出力したいデータをあらかじめセットしておき、

次のPage処理で取得してからCSV出力します。

というのは、次ページに移った時に出力するってことでしょうか?

うう、きっとすごい初歩なんだろうなぁ。スミマセン(>_<)

 状況整理することによって、問題点を明確化しなければ、質問者と回答者の両方の時間を無駄にしてしまいます。
 問題点は、CSVファイルをクライアントにダウンロードしつつ、画面遷移を行いたいのでしょうか?それとも、ファイルはサーバに保存し、その後、画面遷移を行いたいのでしょうか?
 ファイルをダウンロードしつつ、画面遷移を行うのそこそこ骨が折れるような気がいたします。サーバに保存するだけであれば、かなり簡単だと思いますが。  

投稿者:餅宮餅吉

編集 履歴 (0)

NAL-6295さんの書き込み (2005-07-05 17:23) より:

Response.Endしているので、Server.Transferが実行される事はありません。

あぅ、確かにおっしゃるとおりです。
ご指摘有難うございます!
拙者、おっちょこちょいなものですから・・

餅宮餅喜さんの書き込み (2005-07-05 17:44) より:

 状況整理することによって、問題点を明確化しなければ、質問者と回答者の両方の時間を無駄にしてしまいます。

そうですね、回答した側としても反省してます。。
反射的に回答し、不正確な情報を発信してしまいました。
[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-07-05 18:01 ]

投稿者:葉瀬崎浩樹

編集 履歴 (0)

ひなさんの書き込み (2005-07-05 16:59) より:

葉瀬崎浩樹さんの、

遷移前に、出力したいデータをあらかじめセットしておき、

次のPage処理で取得してからCSV出力します。

というのは、次ページに移った時に出力するってことでしょうか?

--- ???.aspx ---
1.ボタン押下時、csvファイルをサーバへ作成
 (作成したディレクトリ情報/ファイル名をSessionに格納)
2.Fin.aspxへリダイレクト

--- Fin.aspx ---
3.Fin.aspxにてRegisterStartupScriptにて、自身がsubmitされるようにする
4.Fin.aspxがクライアントへ表示されると同時に「3.」のJavaScriptにてPostBackが発生
5.「1.」で作成したファイルをResponseする

# 他にも案があるだろうけども...、頑張ってね。

[追記]
おっ...問題を明確化...、される前に書いてしまった。(同じく反省)
[ メッセージ編集済み 編集者: えんぞ@? 編集日時 2005-07-05 18:01 ]

投稿者:えんぞ@?

編集 履歴 (0)

みなさま、ありがとうございます!
確かにResponse.Endしているので、画面遷移ができなかったんですね。

とりあえず、下記のような感じでクライアント側かな?
保存することができました。
みなさまの回答をまだ全部読んでないのでゆっくり読ませていただきます。
がんばります。
ありがとうございました♪

'***********************************
' Dim n As Integer
' Dim strCsvdata As String
'
' strCsvdata = ( lblQ1AnsImp.Text & "," & lblQ2AnsImp.Text & "," & lblQ3AnsImp.Text & "," & lblQ4AnsImp.Text & "," & lblQ5AnsImp.Text )
'
' Dim csvF As System.IO.FileStream = System.IO.File.OpenWrite( "C:\sample.csv" )
' Dim csv As System.IO.StreamWriter = New System.IO.StreamWriter( csvF )
'
' csv.BaseStream.Seek( 0, System.IO.SeekOrigin.End )
' csv.WriteLine( strCsvdata )
' csv.Flush()
' csv.Close()
' csvF.Close()
'
' Server.Transfer( "Fin.aspx" )
'
'End Sub
'***********************************

投稿者:ひな

編集 履歴 (0)

ひなさんの書き込み (2005-07-06 10:08) より:

とりあえず、下記のような感じでクライアント側かな?

保存することができました。

'***********************************

' Dim n As Integer

' Dim strCsvdata As String

'

' strCsvdata = ( lblQ1AnsImp.Text & "," & lblQ2AnsImp.Text & "," & lblQ3AnsImp.Text & "," & lblQ4AnsImp.Text & "," & lblQ5AnsImp.Text )

'

' Dim csvF As System.IO.FileStream = System.IO.File.OpenWrite( "C:sample.csv" )

' Dim csv As System.IO.StreamWriter = New System.IO.StreamWriter( csvF )

'

' csv.BaseStream.Seek( 0, System.IO.SeekOrigin.End )

' csv.WriteLine( strCsvdata )

' csv.Flush()

' csv.Close()

' csvF.Close()

'

' Server.Transfer( "Fin.aspx" )

'

'End Sub

'***********************************

保存されるのはサーバ側ですよ。
_________________「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/

投稿者:NAL-6295

編集 履歴 (0)

NAL-6295さんの書き込み (2005-07-06 10:16) より:

保存されるのはサーバ側ですよ。

ですよね。それで良かったのかしら。
最初に何の為にCSVファイル作成するのかを聞くのを忘れてた。(反省

#拙者も、おっちょこちょい者ですから・・
[ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-07-06 10:38 ]

投稿者:餅宮餅吉

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。