- - PR -
自動ポストバックについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-10 15:12
こんにちは。いつもこちらにはお世話になっております。
親ウィンドウから子ウィンドウを開き、そこで選択された値を親ウィンドウに戻すと自動的にポストバックされ、任意のメソッドが実行される。 ということを実現したいと思い、 ポップアップウインドウから得意先検索 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1084&forum=7&5 などのトピックを参考にさせていただきながらやっています。 親子の値の受け渡しは問題なくできるのですが、 Client-sideのJavaScript(JScript)を組み込むために、Page_loadで SET1.Attributes.Add("OnPropertyChange", Page.GetPostBackEventReference(expandSet)) と記述すると、画面表示がループしてしまいます。 どなたかご指導いただけないでしょうか? | ||||||||||||
|
投稿日時: 2005-03-10 17:00
返答ありがとうございます。このように書きました。
function submitParent(value) { targetField = opener.document.forms[0].TARGET.value; eval("opener.document.forms[0]." + targetField).value = value; opener.document.forms[0].__EVENTTARGET.value = 'expandSet'; opener.document.forms[0].__EVENTARGUMENT.value = ''; opener.document.forms[0].submit(); window.close(); } 値のTARGETフィールドへのセットおよびポストバックはできるのですが、 そこにイベント(expandSet)をひもづけたいのです。 子ウィンドウから戻された値を親ウィンドウのTARGETフィールドにセットし、 TARGETフィールドの値の変更を自動的に察知して、サーバーサイドでDBを検索し、 結果を親ウィンドウ内に展開する・・・というような処理です。 どうぞよろしくご指導ください。 | ||||||||||||
|
投稿日時: 2005-03-10 21:07
『サーバがページにポストバックします』って、難解な日本語。『画面表示がループする』ってのも、わかりにくいですが。
GetPostBackClientEventの使い間違いじゃないですか? ん?OnPropertyChange???なにそれ?そんなイベント、見つからないのですが。。。 ms-help://MS.MSDNQTR.2003FEB.1041/jpisdk/dhtml/references/events/events.htm あ、いや、あった。これか。でも、大文字小文字が違う。。。区別するはずですよ。 ms-help://MS.MSDNQTR.2003FEB.1041/dhtml/workshop/author/dhtml/reference/events/onpropertychange.htm ん〜???本当にこれでいいんですか? _________________ | ||||||||||||
|
投稿日時: 2005-03-10 21:30
とはどのような状況ですか? ポストバックが無限ループして発生するってことでしょうか? あと SET1はTextBoxで expandSetはButtonって認識であってますか? | ||||||||||||
|
投稿日時: 2005-03-11 11:16
はい。SET1はTextBoxで、expandSetはButtonです。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SET1.Attributes.Add("OnPropertyChange", GetPostBackEventReference(expandSet)) このように記述すると、ページのロードが終わると同時に(恐らくsubmitされるため)またpage_Loadが始まります。 SET1.Attributes.Add("onChange", GetPostBackEventReference(expandSet)) onChangeに変更すると、ループはしなくなります。 表示された画面をソース表示してみると、 <input name="SET1" type="text" id="SET1" onChange="__doPostBack('EXPSET','')" /> <script language="javascript" type="text/javascript"> <!-- function __doPostBack(eventTarget, eventArgument) { var theform; if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) { theform = document.Form1; } else { theform = document.forms["Form1"]; } theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); theform.__EVENTARGUMENT.value = eventArgument; theform.submit(); } // --> となっています。 ・・・要領を得ない説明で申し訳ありません。 | ||||||||||||
|
投稿日時: 2005-03-11 12:34
こういう時は簡単なHTMLを作成して自分でいろいろ実験しましょう。
ASP.NETも所詮はHTMLを出力してるにすぎません。 私が実験したところ onChangeイベントはTextBoxに入力後にフォーカスが他のコントロールに移った場合発生 onPropertyChangeイベントはTextBoxに入力するごとに発生しているようです。 また、onPropertyChangeイベントほ紐づけたTextBoxに入力があると、ページがロードされたときにonPropertyChangeイベントが発生するようです。(TextBoxに入力がないと発生しない) 案としては 1.PostBackをさせるためだけのトリガーとなるHiddenを追加する 2.そのHiddenにonPropertyChangeイベントを紐付ける 3.子ウィンドウは親ウィンドウに値を設定する際に、Hiddenにも文字列を設定(なんでもOK) 4.サーバーサイドのPageLoadイベントで毎回、HiddenのValueを空に設定する これでいけそうな気がします(試してないですけど) この方法は結構トリッキーな感じがするので、本当にこのような実装で問題ないかも きちんと検討すべきです。 | ||||||||||||
|
投稿日時: 2005-03-11 17:32
返答ありがとうございます。
onPropertyChangeイベントは、TextBoxに入力がないと発生しないとのことなのですが、 SET1には何も入力されていないのに、イベントが発生しているようです。 また、SET1フィールドに文字を手入力しフォーカスを移動させると、OnChangeイベントが発生するのですが、子ウィンドウから親ウィンドウに値を戻し別フィールドにフォーカスするようにスクリプトを書いても、OnChangeイベントは発生しません。 いろいろやっていて(かなり無理やりな方法ですが)、思っていた動きが実現できました。 SET1.Attributes.Add("onFocus", GetPostBackEventReference(expandSET)) 目的のメソッドをonFocusイベントに紐付けておき、 スクリプトでは、子ウィンドウから値をセットした後、そのフィールドをフォーカスするようにしました。 もう少しいろいろやってます。 | ||||||||||||
|
投稿日時: 2005-03-11 17:59
説明が間違ってました。 TextBoxだと入力なしでも発生しますが、Hiddenだと発生しません。
これは子ウィンドウからTextBoxに値を設定したからといって、フォーカスが移ったわけではないからなのではないでしょうか?
これだと、普通に親ウィンドウで操作してる際にフォーカスが移っただけでPostBackするのではないでしょうか? ちなみに、私の環境では、Hiddenを使用する方法で実現できました。 |
1