none
ボタンのクリック処理中にプログラム起動する場合 RRS feed

  • 質問

  • お世話になります

    ASP.NETでWEBアプリケーションを作っているのですが、ボタンのクリックで、サーバー側のコンソールプログラムを起動して、その処理結果を受け取る処理を書いたのですが、プログラム終了待ちをしないようで、ボタンを何回もクリックできてしまいます。基本的なことで申し訳ないですが、どなたか御教授願います。ちなみに、サーバー側のプログラムが動作している事は確認すみです。

    コード

                Button10.Enabled = false;

                // ProcessStartInfo を指定して起動する
                System.Diagnostics.Process hProcess = System.Diagnostics.Process.Start(hPsInfo);

                // 終了するまで待機する
                hProcess.WaitForExit();
                Button10.Enabled = true;

    環境

     VisualStudio2012

     サーバー:WindowsServer2012


    • 編集済み bikke 2013年2月1日 5:47
    2013年2月1日 5:43

回答

  • > プログラム終了待ちをしないようで、

    Windows アプリと Web アプリの違いを認識されていないようです。

    Web サーバーで Button10.Enabled = false; が実行されても、ブラウザに表示されているボタンが即座に押せないようになるわけではありません。Web サーバーは質問にアップされていたコードをすべて実行してからブラウザに応答を返します。

    なので、以下の 3 行は何の意味もないです、

    > Button10.Enabled = false;
    > hProcess.WaitForExit();
    > Button10.Enabled = true;


    > プログラム終了待ちをしないようで、ボタンを何回もクリック
    > できてしまいます。

    要するにボタンの二度押し防止ができればいいのですよね?

    であれば、ASP.NET AJAX Extensions の PageRequestManager クライアントオブジェクトが提供するイベントを利用して処理中の要求をキャンセルする方法はいかがですか。具体的には以下のページを見てください。

    二度押し防止
    http://surferonwww.info/BlogEngine/post/2010/12/12/Cancel-request-using-PageRequestManager.aspx

    その他、Modalopup を利用して、ボタンを押せないようにする手もあります。

    ModalPopup でプログレス表示
    http://surferonwww.info/BlogEngine/post/2011/05/29/Show-progress-in-ModalPopup.aspx


    • 編集済み SurferOnWww 2013年2月1日 12:49 誤記訂正
    • 回答としてマーク bikke 2013年2月3日 23:24
    2013年2月1日 12:37

すべての返信

  • > プログラム終了待ちをしないようで、

    Windows アプリと Web アプリの違いを認識されていないようです。

    Web サーバーで Button10.Enabled = false; が実行されても、ブラウザに表示されているボタンが即座に押せないようになるわけではありません。Web サーバーは質問にアップされていたコードをすべて実行してからブラウザに応答を返します。

    なので、以下の 3 行は何の意味もないです、

    > Button10.Enabled = false;
    > hProcess.WaitForExit();
    > Button10.Enabled = true;


    > プログラム終了待ちをしないようで、ボタンを何回もクリック
    > できてしまいます。

    要するにボタンの二度押し防止ができればいいのですよね?

    であれば、ASP.NET AJAX Extensions の PageRequestManager クライアントオブジェクトが提供するイベントを利用して処理中の要求をキャンセルする方法はいかがですか。具体的には以下のページを見てください。

    二度押し防止
    http://surferonwww.info/BlogEngine/post/2010/12/12/Cancel-request-using-PageRequestManager.aspx

    その他、Modalopup を利用して、ボタンを押せないようにする手もあります。

    ModalPopup でプログレス表示
    http://surferonwww.info/BlogEngine/post/2011/05/29/Show-progress-in-ModalPopup.aspx


    • 編集済み SurferOnWww 2013年2月1日 12:49 誤記訂正
    • 回答としてマーク bikke 2013年2月3日 23:24
    2013年2月1日 12:37
  • TO:SuferOnWWWさん

    早速の返信ありがとうございます。(土日は休日だったので、返信おくれてすいません)

    Text1.Text="サンプル文字列”とコーディングできるので、勘違いしてしまいました。

    御教授いただいたURLを参照して、対応してみます。

    2013年2月3日 23:24
  • PS
    全画面が灰色になり、操作画面的に解りやすいので、ModalPopupを使う事にしました。
    2013年2月4日 0:41
  • > Text1.Text="サンプル文字列”とコーディングできるので、
    > 勘違いしてしまいました。

    どういう意味でしょう?

    Text1 というのが何だかわかりませんが、Label または TextBox だとして、Web サーバーで Text1.Text="サンプル文字列"; が実行されても、即座にブラウザ上の表示にそれが反映されるわけではありません。

    どんなサーバーコントロールでも、Web サーバーではすべてのコードが実行されてから html コードに変換され、それが応答としてブラウザに返されるのには変わりないです。

    Web アプリと Windows アプリの違いをきちんと理解すれば、今後の開発がもっとスムーズに行くと思います。

    2013年2月4日 11:43