プロが教える店舗&オフィスのセキュリティ対策術

お世話になります、よろしくお願いします。

VisualStudio2003でASP.NET(VB)とJavascriptを使ってサイト製作をしています。

ラジオボタンにJavascriptを入れて、項目の表示/非表示を切り替えています。(CSSのdisplay:noneとinlineを切替)

これとは別に、ドロップダウンリストが2つ(A,B)あり、Aのドロップダウンリストを変更するとPostBackして、Bの選択肢が変化するといった風に作成しています。

ここで問題が発生し、PostBackが発生すると、項目の表示が初期状態に戻ってしまいました。

あれこれと考えて、Aにも項目の表示/非表示を切り替えるJavascriptを付けたのですが、どうもJavascriptが実行されてからPostBackが発生しているようで、お手上げです。

PostBackが発生しても、表示をそのままにできる方法は無いのでしょうか?よろしくご教授下さい。

A 回答 (7件)

ポストバック間で状態を保存したいコントロールには、EnableViewStateをTrueにしてください。


サーバコントロールのインスタンスはポストバックを超えて保持されます。
また、PageLoadイベント内でコントロールの初期化を行う場合は、
IsPostBackプロパティを参照し、初期アクセスとポストバックで分けてください。
そうでないと、アクセスのたびに初期化が起きます。
#ページのインスタンスはページアクセスの度にnewされます。
#そのため、変数やコントロールの値はすべて初期化されます。
#ポストバックをまたぐには、SessionとViewStateを使用します。

Atras.NETを使用しないのであれば、
No5のようにRegisterStartupScriptでするのが正解です。
クライアントサイドでの変更もこれで対応します。

なお、最初の回答のようにダミーコントロールの使用は避けてください。
Page.ViewStateを利用してください。
Me.ViewState("aaa") = ・・・・
    • good
    • 0

PageLoadイベントで以下のようにすれば何とかなると思います。



Dim sb_script As String
sb_script = "<script Language='JavaScript'>" & vbCrLf & _
"onload=displayChg();" & vbCrLf & _
vbCrLf & _
"</script>"
RegisterClientScriptBlock("openwin", sb_script)

また、この方法とは全く別に、AドロップダウンとBドロップダウンの連動にAjaxを利用する方法もあるのではないでしょうか?この方法だとリロードが発生しません。
    • good
    • 0

ANo.3様 の通りですが、


「PageLoadの後にJavascript実行したい」ということ、
開発環境がVS2003であれば、
PageクラスのRegisterStartupScriptを使用してJavaScriptを
設定してください。
ブラウザに表示された後、設定したJavaScriptが走るはずです。
    • good
    • 1

ん? んん?



すみません ちょっと問題を整理します
<条件>
 ・ラジオボタンで項目の表示/非表示を設定している
 ・ドロップダウンリストがA、Bの2個ある
 ・Aを選択後、PostBackが発生させてBの選択肢を変化させている

<現象>
 ・Aを選択後に項目の表示が初期状態に戻る
  すべての項目が非表示になっていた?ってことですよね?

<原因>
 PostBack発生後ページが再表示されるが
 その際、ラジオボタンのJavaScriptが実行されないのでDIVタグに埋め込まれていた初期状態の「style="DISPLAY:none"」が適用されて
 すべての項目が非表示になってしまう

現在 上記のように把握しているのですが
間違いないでしょうか?

ということであれば…
あまり難しく考えずに簡単にいきましょう

そのJavaScriptが埋め込まれているaspx側に
window.onload = _displayChg;
を追加するというのはどうでしょう?

ページを表示する際には必ず「_displayChg」を実行させて
項目の表示/非表示を設定し直します
ラジオボタンの初期値は設定する必要がありますが…

window.onloadはページが表示されるときに発生しますので
PostBack発生後にJavaScriptが実行されるようになります
    • good
    • 0

> PostBackが発生しても、表示をそのままにできる方法は無いのでしょうか?



クラアントスクリプトでスタイルを切り替えたという情報はサーバに送信されない。
ラジオボタンの値は送信されるので、「項目の表示/非表示を切り替え」と同じ事をサーバ側で行えばよい。
    • good
    • 0

ん? なんか勘違いをしていたようです…



それでしたら
PageLoad時にJavaScriptを再度実行するしか手はないようですね…

どのようなJavaScriptを実行されているのか
教えていただけないでしょうか?

この回答への補足

返答が遅れてしまい、申し訳ありません。
Javascriptはaspx側に記述していますが

function _displayChg(){
var objAri = document.Form1.rblKBN[0];
var objNasi = document.Form1.rblKBN[1];
if(objAri.checked == true){
  hoge.style.display = "inline";
}else if (obNasi.checked == true){
  hoge.style.display = "none";
}

と記述し、表示/非表示したいコントロールを
<DIV id="hoge" style="DISPLAY:none"></DIV>
で囲っています。

補足日時:2006/12/08 18:17
    • good
    • 0

おそらくPostBack発生後 PageLoadイベントが発生して初期状態に戻っているのでしょう


これは仕様ですので仕方がないです

回避方法として手頃な方法は
ページ中にダミーコントロールを用意して
PageLoadイベント(1回目)でダミーコントロールにフラグをたてるようにする
PostBack発生後のPageLoadイベント(2回目以降)では
ダミーコントロールにフラグがたっていればExitSubみたいな感じにすればよろしいんではないでしょうか?

この回答への補足

回答ありがとうございます。

Page_Loadイベント内でPostBackか非PostBackなのかの判断は行っているのですが、やはり初期状態に戻っています・・・

PostBack時の処理はドロップダウンリストBだけを初期化して、項目を変更しています。

CSSの表示切替を別の手段で行った方がいいのでしょうか・・・
現在、仕方無くコントロールのvisibleをfalseにして表示切替を行っていますが、これだとコントロールのある部分に空白が出来てしまい、見栄えが悪いです。

補足日時:2006/12/08 10:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A