- PR -

自動ポストバックについて

1
投稿者投稿内容
まめ
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 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))

と記述すると、画面表示がループしてしまいます。

どなたかご指導いただけないでしょうか?


まめ
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 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を検索し、
結果を親ウィンドウ内に展開する・・・というような処理です。

どうぞよろしくご指導ください。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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
ん〜???本当にこれでいいんですか?

_________________
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-10 21:30
引用:

画面表示がループしてしまいます。



とはどのような状況ですか?
ポストバックが無限ループして発生するってことでしょうか?

あと
SET1はTextBoxで
expandSetはButtonって認識であってますか?
まめ
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 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();
}
// -->

となっています。

・・・要領を得ない説明で申し訳ありません。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 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を空に設定する

これでいけそうな気がします(試してないですけど)
この方法は結構トリッキーな感じがするので、本当にこのような実装で問題ないかも
きちんと検討すべきです。

まめ
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 2005-03-11 17:32
返答ありがとうございます。

onPropertyChangeイベントは、TextBoxに入力がないと発生しないとのことなのですが、
SET1には何も入力されていないのに、イベントが発生しているようです。

また、SET1フィールドに文字を手入力しフォーカスを移動させると、OnChangeイベントが発生するのですが、子ウィンドウから親ウィンドウに値を戻し別フィールドにフォーカスするようにスクリプトを書いても、OnChangeイベントは発生しません。

いろいろやっていて(かなり無理やりな方法ですが)、思っていた動きが実現できました。

SET1.Attributes.Add("onFocus", GetPostBackEventReference(expandSET))
目的のメソッドをonFocusイベントに紐付けておき、
スクリプトでは、子ウィンドウから値をセットした後、そのフィールドをフォーカスするようにしました。

もう少しいろいろやってます。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-11 17:59
引用:

onPropertyChangeイベントは、TextBoxに入力がないと発生しないとのことなのですが、
SET1には何も入力されていないのに、イベントが発生しているようです。


説明が間違ってました。
TextBoxだと入力なしでも発生しますが、Hiddenだと発生しません。

引用:

また、SET1フィールドに文字を手入力しフォーカスを移動させると、OnChangeイベントが発生するのですが、子ウィンドウから親ウィンドウに値を戻し別フィールドにフォーカスするようにスクリプトを書いても、OnChangeイベントは発生しません。



これは子ウィンドウからTextBoxに値を設定したからといって、フォーカスが移ったわけではないからなのではないでしょうか?

引用:

SET1.Attributes.Add("onFocus", GetPostBackEventReference(expandSET))
目的のメソッドをonFocusイベントに紐付けておき、
スクリプトでは、子ウィンドウから値をセットした後、そのフィールドをフォーカスするようにしました。



これだと、普通に親ウィンドウで操作してる際にフォーカスが移っただけでPostBackするのではないでしょうか?

ちなみに、私の環境では、Hiddenを使用する方法で実現できました。


1

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