- PR -

PDFの出力とページの表示変更を一度のレスポンスで行いたいです。

投稿者投稿内容
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-05 19:05
こんばんは。
ASP.NET2.0(VB)とActiveReportsのPDF出力を使っています。
ActiveReportsのサンプルコードを見ながら、
With m_page
 .Response.Clear()
.Response.ClearHeaders()
.Response.ClearContent()
.Response.ContentType = "application/pdf"
.Response.AddHeader("content-disposition", "attachment; filename=abc.pdf")
objPdf.Export(pdffile.Document, objStream)
.Response.BinaryWrite(objStream.ToArray)
.Response.End()
End With
のようなコードで、PDFの出力を行っています。
これでPDFの出力自体はうまくいくのですが、
同時にページの表示内容を変更することができません。
上記のコードの前にページの内容を変更するコード(例えば、ラベルに表示する文字を変えるなど)書いて、
.Response.Clear()
.Response.ClearHeaders()
.Response.ClearContent()
の部分をコメントアウトしてもだめでした。
.Response.End()
のところをコメントアウトにすると、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
とのエラーになってしまいます。
質問の仕方が下手ですみません。
PDFの出力を行いながら、同時にページの表示内容の変更も反映させるには、
どうすればよいのでしょうか。
漠然とした質問の仕方になってしまって、本当にすみません。
よろしくお願いします。


かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-04-05 19:49
ボタンのポストバックの前に Javascript で PDF 出力用のサブウインドウを開き、
その後ポストバックするようにしてはどうでしょうか。
_________________
かるあ のメモスニペット
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-05 20:36
お返事ありがとうございます。
>ボタンのポストバックの前に Javascript で PDF 出力用のサブウインドウを開き、
>その後ポストバックするようにしてはどうでしょうか。
たまにダウンロード画面とかで小さなウィンドウが出たりしますが、
あれはそういうことだったのですか。
どういう仕組みなのか、今ひとつわかっていないのですが、
ボタンにAttributes.Addか何かで、PDFを呼び出す画面を開くJavaScriptを記述して、
一方で、ボタンの処理もするといった感じでしょうか。
ただ、これだと少し問題があるのではないかと思っています。
(私の推測が間違っていたらすみません)
実は、ボタンを押した際にデータベースの登録処理を行い、その結果をPDFに表示しています。(その時に、ページの方で、前の操作で表示されているメッセージなどを消したいのです。
ですので、データベースへの登録処理が必ず先に終わっていないといけないのです。
すみません。良いアドバイスを頂いたのに。(これはこれですごく役に立つアドバイスなのですが)
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-04-05 23:29
引用:

やよいさんの書き込み (2007-04-05 20:36) より:

実は、ボタンを押した際にデータベースの登録処理を行い、その結果をPDFに表示しています。(その時に、ページの方で、前の操作で表示されているメッセージなどを消したいのです。
ですので、データベースへの登録処理が必ず先に終わっていないといけないのです。


そうですね。
ご指摘の通り並列に動作するので更新を保障できません。

そうなると、
ポストバック→更新→ページロードでサブウインドウを開いてPDF表示
とすれば表示できると思いますが、少し動きが気に食わないかもしれません。

他には ASP.NET AJAX を使用して
ボタンクリック→更新、表示の更新→サブウインドウを開いてPDF表示
とすれば実現できそうです。
_________________
かるあ のメモスニペット
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-06 09:25
ありがとうございます。
>ポストバック→更新→ページロードでサブウインドウを開いてPDF表示
>とすれば表示できると思いますが、少し動きが気に食わないかもしれません。

>他には ASP.NET AJAX を使用して
>ボタンクリック→更新、表示の更新→サブウインドウを開いてPDF表示
>とすれば実現できそうです。

ASP.NET AJAXですか。
言葉だけは聞いたことがありますが・・・。
道筋は、少し開けたような気がします。
私に実現できるかどうかは別として・・・。
週末は、書籍とサンプル探しの旅になりそうです・・・。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-04-06 09:40
引用:

やよいさんの書き込み (2007-04-06 09:25) より:

ASP.NET AJAXですか。
言葉だけは聞いたことがありますが・・・。
道筋は、少し開けたような気がします。
私に実現できるかどうかは別として・・・。
週末は、書籍とサンプル探しの旅になりそうです・・・。


自分で例に挙げておいてなんですが、プロジェクトの途中からこういった技術を導入するのはあまりお勧めできません。
まずは最初にあげた例をもとにサンプルを作成してみてはどうでしょうか?
_________________
かるあ のメモスニペット
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-06 10:30
ありがとうございます。
ASP.NET AJAXは勉強用に置いておいて。
最初に紹介して頂いた方法で考えたのですが、
データベースへの登録がされたかどうかのフラグをSessionに入れて、サブウィンドウはループでそれを監視して(無限ループにならないように注意して)、登録が完了したことを確認したら、PDFの出力を開始するのはどうかなと思いました。
ただ、これだと、登録に失敗した場合にJavascriptでサブウィンドウを閉じるようにすると、
「ウィンドウが閉じられる」旨のメッセージボックスが出てしまうような。
メッセージボックスを出さずにサブウィンドウを閉じられればよいのですが。

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-06 10:53
引用:

やよいさんの書き込み (2007-04-06 10:30) より:

最初に紹介して頂いた方法で考えたのですが、
データベースへの登録がされたかどうかのフラグをSessionに入れて、サブウィンドウはループでそれを監視して(無限ループにならないように注意して)、登録が完了したことを確認したら、PDFの出力を開始するのはどうかなと思いました。


私であれば、まず登録ボタンなどを押したタイミングで PostBack し、DB
への登録とページの内容を書き換えて新しいページを出力までを行います。

そしてその PostBack 後の新しいページに RegisterClientScript メソ
ッドなりを利用して、JavaScript で page の onload あたりに新しいウ
ィンドウを開くスクリプトを追加します。

新しいウィンドウは PDF を出力するための別の aspx ファイルを開くよう
にしておいて、その aspx ファイル内では登録済みの DB の内容を読み
込んで PDF を出力する、といった感じです。

この方法は以前実際に使った方法ですが(ASP.NET 1.0 の頃なので
RegisterClientScriptBlock メソッドを使いました)基本的な考え方はそ
のままで応用できると思います。

引用:

上記のコードの前にページの内容を変更するコード(例えば、ラベルに表示する文字を変えるなど)書いて、
.Response.Clear()
.Response.ClearHeaders()
.Response.ClearContent()
の部分をコメントアウトしてもだめでした。
.Response.End()
のところをコメントアウトにすると、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
とのエラーになってしまいます。


どうもこのあたりを拝見すると、Web システムについての勉強をもう少しさ
れた方が良いのでは…と老婆心ながら思ってしまいました。
(できれば HTTP の基礎からやるのがいいですが、そこまで掘り下げる
必要もないかもしれません)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)