- PR -

[ASP.NET]ドロップダウンリストのイベントが取得できない

1
投稿者投稿内容
さり
常連さん
会議室デビュー日: 2003/05/13
投稿数: 38
投稿日時: 2003-10-24 20:33
ASP.NET WebアプリケーションをC#で作成しています。
.NET Frameworkのバージョンは1.1で、VS.NET2003を使用して開発しています。

AutoPostBackをtrueにしたドロップダウンリストの変更時のイベントが、正常に
取得できない、といった現象にあっています。

単純にドロップダウンリストの変更時のイベントは正常にとれます。
やりたい事はすべての場合にラウンドトリップさせるのではなく、クライアントサイド
においてある条件を満たした時のみ、ラウンドトリップをさせたいと思っています。
例えば、選択したドロップダウンリストの値をによって、ラウンドトリップさせたり、
させなかったりする、といった形です。

例えば、選択肢の一番上を選択した時のみラウンドトリップさせるような形にします。
まず、ddlHogeというIDのWEBコントロールのドロップダウンリストをおきます。
クライアントサイドのJavascriptに以下の記述をします。

コード:
aspxファイルのクライアントのJavascript

function CmbOnChange()
{
	var cntddl = document.Form1.ddlHoge;
	if(cntddl.selectedIndex==0)
	{
		return true;
	}
	else
	{
		return false;
	}
}



コードビハインドファイルのPage_Loadイベントに以下の記述をします。
コード:
if(!IsPostBack)
{
	this.ddlHoge.Items.Add("aaa");
	this.ddlHoge.Items.Add("bbb");
	this.ddlHoge.Items.Add("ccc");
	this.ddlHoge.Attributes.Add("onchange","if(CmbOnChange()==true)");
}




ドロップダウンリストのonchangeイベントにCmbOnChange関数をフックして、
CmbOnChangeがtrueを返した時のみ、ラウンドトリップを発生させようとしています。

できあがったレスポンスでは以下のようなHTMLになります。
コード:
<select name="ddlHoge" onchange="if(CmbOnChange()==true)__doPostBack('ddlHoge','')" 
language="javascript" id="ddlHoge">



この時、正常にCmbOnChange関数を通りかつ返り値を返し、__doPostBack関数に引数を渡している
にも関わらず、コードビハインド側のドロップダウンリストの変更時イベントにはとびません。
しかし、ラウンドトリップ自体は発生しています。


コードビハインドファイルで、ドロップダウンリストとJavascriptの関数を関係付けている
1センテンスを以下のように書き換えると正常に動作します。

コード:
//ダイアログを表示してOKが選択された場合のみ処理を続行する
this.ddlHoge.Attributes.Add("onchange","if(confirm('OK/Cancel')==true)");




すみませんが、よろしくアドバイスをお願いします。
(長文お付き合いくださり、ありがとうございました。)
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2003-10-27 11:45
こんにちは。

「ドロップダウンリストの変更時のイベントが、正常に取得できない」のは
「選択肢の一番上を選択した時のみラウンドトリップさせる」ようにした
ときだけですよね?
javascriptの部分で if(cntddl.selectedIndex==1) とすれば
上から2番目が選択されたときにラウンドトリップが発生し、このときは
正常にイベントが取得できると思います。

または、コードビハインドの部分に
this.ddlHoge.SelectedIndex = 1; //0以外ならよい
を追加すれば if(cntddl.selectedIndex==0) の場合もイベントをちゃんと
取れると思います。

つまりどういうことかというと、ドロップダウンのSelectedIndexChangedイベントは
あくまでも選択状態が変更されたときに発生するのであって、同じ項目を
選択しなおしたときは発生しないのです。この場合
1、ページロード時はデフォルトで一番上が選択されている
2、クライアント側で別項目を選択したりして、最終的に一番上を
  選択する(このとき初めてラウンドトリップ)

で、結果的にサーバから見れば選択項目に変化はないからイベントが走らないのでしょう。
さり
常連さん
会議室デビュー日: 2003/05/13
投稿数: 38
投稿日時: 2003-10-27 12:15
なるほど、言われてみればそのとおりです、サーバから見たら変更は発生していませんね。
納得です。

ちょっとやり方を変えて、ドロップダウンリストをAutoPostBackするのではなく、
ドロップダウンリスト変更時のJavascriptの中から、判定を行った後にラウンドトリップを
発生させたいと思います。

べるさん、ありがとうございました。
1

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