ポストバックが完了するまで、次の操作を無効にしたい(ModalPopUpのTageteControlIDになっているImageButtonを一時期操作無効にしたい)
Category: fx aspnet_ja
Question
saya24 on Wed, 13 Mar 2013 02:00:57
標題の件、ありがちな質問かも知れませんが、ご見解を頂けましたら幸いでございます。(本件VVWのフォーラムへ一時期誤って掲載した時期がありました、すみません)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28936&forum=7 の記事を参考に、ポストバックが成立するまで、ユーザから押下されて欲しくないImageButtonへ IsReadyState()のスクリプトを属性登録しています。
Loadイベント内で、
ImageButton25.Attributes("OnClick") = "if(!IsReadyState()) return false;"
と記述しています。しかし、ポストバック成立前に、当該ImageButtonの押下が相変わらず可能な状況であり 進展を得ません。やはり当該ImageButtonが、あるModalPopupコントロールの TargetControlIDになっている点が起因しているのでしょうか???
ちなみに、このImageButton押下で現れるModalPopUp(パネル上のGridView)の開発は、別の案件
http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/cc1e1ad4-6444-4400-85aa-c1c98c64699a
でお手伝いいただきまして達成しています。
当該ImageButtonと直近のポストバックの関係について記載します。
①Webフォーム上のテキストボックスへ、社内取扱いの品名コードが入力される。(もしくは他検索画面からの値採用)
②ModalPopUpのLoadイベントで、先ほどのImageButtonがいつ押されてもいいように、当該品名の在庫状況がサーバーへ確認され、パネル上(ModalPopUp上)のGridViewが最新化しようとする。つまり、ポストバックが働く!
③...上記は社内の基幹システムへ在庫状況を検索しにいくので、実はModalPopUp上のGridViewが生成されるまである程度時間を要す。(表示はしないものの)
④ユーザが、在庫状況からロット№を引き当てる意味で、当該のImageButtonを押下。
⑤ModalPopUp・パネル上のGridViewが画面に現れてくる。
⑤' 但し!!!! ④のユーザの操作が早い③の完了以前に発生すると、ModalPopUpは確かに現れるも 空のGridViewとなってしまう!
この⑤'の状況を打破したく、問い合わせしております。
ModalPopUpの瞬時立ち上がってくれるイイ部分を望みながら、ある時期までは無効にしたい、という身勝手な望みかも知れません。
いずれにせよ、GridViewの内容が仕上がるまで=ポストバックが成立するまでは当該ImageButtonの操作を禁止・無効化したい、というのが望みで、当対策案に拘りはありません。別策の有無・ご紹介でも結構ですので、ご助言を頂けないでしょうか?
何卒よろしくお願い申し上げます。
Replies
SurferOnWww on Wed, 13 Mar 2013 04:03:05
今提供されている情報で言えるのは、非同期ポストバックを行っているとすると、document.readyState は即 complete となるため、質問に書いてあるような方法は二度押し防止には使えませんということぐらいです。
一体何をしようとしているのか質問に書いてあることからはよく分かりません。なので、代案を考えることもできません。
全体的にやりたいことは何か、開始から終了までどのようなシナリオを考えているか、そのために Page に配置したコントロールは何か、それらをどのように操作しているのかなど、回答者が理解できるように書いていただけませんか。
saya24 on Wed, 13 Mar 2013 05:44:45
SuferOnWww様
早速のご見解をありがとうございます。修正箇所を最低限にとどめたい気持ちが現れてしまいましたね。ご支援頂いているのに申し訳ございません。以後気をつけます。
>全体的にやりたいことは何か?
ユーザが品名コードと数量を入力し、出庫申請データを登録する動作を達成します(当該画面)。基幹システムOracleDBの在庫情報・取扱品名情報を参照したシステムであり、予め登録された品名コードであることの牽制、在庫として保有されたロット№の任意指定(入力)を可能にしています。他画面では この登録内容を表示させ、承認・否認できるシステムであり、承認された申請データは定刻で、基幹システムへデータ連動されるというのが全体像です。
【一連の流れ(問題の一Webフォーム上のはなし)】
①ユーザは品名コードと数量のテキストボックスに内容を入力
②ポストバックでModalPopUp内にロット明細が仕上がる(パネル&GridViewの表示は控えられている)
③ユーザは先ほど入力した品名コードで現在在庫している当該品の保有ロット№をModalPopUp内GridView上で確認するため、今問題となっているImageButtonを押下する。現れたGridViewの中から行を選択
④上記行選択を受け、ModalPopUpは閉じられる。当画面の当該ロットの有効期限日TextBox・保管場所DropDownListへ値が引用される
⑤登録手続き上の役者が画面に全て出揃ったことを受け、ユーザは画面上の内容を確認してコマンドボタンを押下
⑥SQLServerのあるテーブルへ 画面内容を登録する。(...これで終了)
【ポイント】
Webフォーム上のテキストボックスに予めDBに登録された品名コードをユーザが入力、もしくは他画面(品名検索一覧)から適用されて格納される。別にこのテキストボックス自体のTextChangeイベントで、ModalPopUp内のGridViewを生成しなおすコーディングをしているわけでなくPostBack=Trueの設定に当該テキストボックスがなっており、ModalPopUpのLoadイベントでGridViewのリニュアルがなされる。
ModalPopUp上のGridViewは、ユーザから入力された品名コードに合致するロット明細が形成されます。行=ロット№違い
この形成に残念ながら時間を費やし、なんとかModalPopUp内GridViewが行を生成されるまで、これ(ModalPopUp)を開くトリガとなっているImageButton押下を抑制したい、というのが願いです。
一応に分かりやすく書いてみたつもりですが、如何でしょうか。
引き続きよろしくお願い致します。
SurferOnWww on Wed, 13 Mar 2013 06:41:47
二度押し防止をしたいのかと思っていましたが違うようですね。
> ②ポストバックでModalPopUp内にロット明細が仕上がる
要するに、上記 ② の応答がブラウザに帰ってくる前には ImageButton は押せないようにすれば良いのでしょうか?
であれば、初期画面では ImageButton.Enabled プロパティを false に設定しておき、上記 ② でポストバックした時サーバー側で true にすればよさそうですが。
saya24 on Wed, 13 Mar 2013 07:36:45
SufferOnWww様
ッゲ、確かにそうかもしれません。アイディアを反映して後ほど報告致します。
まずはお礼まで
saya24 on Wed, 13 Mar 2013 12:27:17
SuferOnWww様
いつもご支援をありがとうございます。
>上記 ② の応答がブラウザに帰ってくる前には ImageButton は押せないようにすれば良いのでしょうか?
全くそのとおりで、頂きましたご見解で無事解決に至れました。
①PageLoadイベントで、Is Not PostBackの際に限り、当該ImageButton.Enable=False
②GridViewを配置したModalのLoadイベントで、GiridView1.Row.Count>0の際は当該ImageButton.Enable=True、その条件に当てはまらない場合当該ImageButton.Enable=False
としました。今回も助かりました!