- PR -

ASP.NETでのListBoxにOnClickを付けたい

1
投稿者投稿内容
kick
会議室デビュー日: 2005/03/23
投稿数: 4
投稿日時: 2005-03-23 10:34
はじめまして。

ASP.NET(C#)でListBoxを使用しております。
ListBoxでSelectedIndexChangedのアクションを用いておりますが、
既に選択されているItemをもう一度選択した場合、ポストバックが発生しません。

ListBoxにOnclick属性を付けて、htmlの隠し引数を設定し、サーバーにポストバック
(submit()し、隠し引数の値によって、イベントを振り分けることによって、
何とか動かすことには成功したのですが、もう少しスマートにやる方法はないでしょうか

現在はイベント定義で何とかする方法を模索中です。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-23 19:54
 ASP.NETのコードは2箇所で動作します。VB.NETやC#でかく、サーバで実行されるコードと、JavaScriptやVBScriptでかく、クライアントで実行されるコードです。
 System.Web.UI.WebControls.ListBoxクラスに定義されているイベントは、サーバで実行されるコードです。このコードは、クライアントの設定によらず、実行できるコードになっています。つまり、AutoPostbackはスクリプトを使うため、クライアントがスクリプトを無効にしていると使えません。
 SelectedItemChangedは、submitボタンによって提出されれば、拾えるイベントです。しかし、“クリックされた”ことは、スクリプトが有効でなければ拾えません。submitボタンがクリックされるまで、どのコントロールでどのようなイベントが、どの順番で、何回発生したか、憶えておくことは非現実的ですし、元々のHTMLの仕様にそのようなイベントは考慮されていません(HTMLはテキストのマークアップを目的とした言語ですから、当たり前ですね)。

 このため、現状で十分スマートかと思います。

 なお、SelectedItemChangedイベントを発生させられない状況もあります。AutoPostback, ViewStateを共にFalseにしていると、イベントが発生する条件である“クライアントに送り出したときから状況が変わっているか”を判別できなくなり、イベントも発生しなくなります。

たしか、そんなことが起こった。。。ちょっと自信なし

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-03-23 19:55 ]
kick
会議室デビュー日: 2005/03/23
投稿数: 4
投稿日時: 2005-03-23 20:38
丁寧な解説、ありがとうございました。

補足ですが、私の環境はAutoPostBackもVIEWSTATEもONです
ここでASP:ListBoxに@ヤマダ、Aスズキ、BサトーをDataBindします
(selectedindexは-1に設定)
次にクライアントが@ヤマダを選択するとAutoPostBackで以下のメソッドが実行されます
ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{}

さらにクライアントが既に選択されている@ヤマダを選択したところ、
POSTBACKもせず、当然ListBox1_SelectedIndexChangedメソッドも通りません。

選ばれたアイテムをもう一回選ぶなんて、ユーザーがおかしいと言えばそこまでかも
しれませんが、そういう事態もあるため、JAVASCRIPTのように、全ての部品に
一様にEventHandlerを用意してくれてもいいかなと思いました。

なお、この件はASP:ListBoxにondblclickを付与し、javascriptのfunctionを呼び出し、
そこで「__doPostBack(listbox1,null)」を記述することによって何とかなりました。
ポイントは選択されていないitemをダブルクリックしてもondblclickが起動しないところです。

javascriptと.netの併用は基本的に良くないのでしょうが、実際にユーザ寄りのAPを開発しようとすると不可欠だと考えています。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-03-24 10:02
kickさん、お早うございます。

引用:

さらにクライアントが既に選択されている@ヤマダを選択したところ、
POSTBACKもせず、当然ListBox1_SelectedIndexChangedメソッドも通りません。


選択されているインデックスが変わってないのだから、当然、イベントは発生しませんよね?

引用:

javascriptと.netの併用は基本的に良くないのでしょうが、実際にユーザ寄りのAPを開発しようとすると不可欠だと考えています。


併用が良くないというのは誤解です。
何でもかんでもユーザの言う事を聞いて標準から外れた事を無理矢理、実現すると、思わぬところでハマったりするかも知れません。HTMLに出来る事なんてたかが知れてます。

それなら、AutoPostBack をやめて、送信ボタンを横に置いた方が良いのではないかと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-24 21:16
 あ、いや、だから、、、ん〜、まず、ベースとなっているインターネットを理解してください。

 インターネットは、今お使いのものは100ベースであったりギガベースであるかもしれません。しかし、開発された当初はもっと帯域の狭いものでした。
 また、HTMLはHyper Text Markup Languageの略であり、テキストを修飾することが目的の言語です。したがって、テキストを選択するだの、その上でクリックするだのは、もっと後になってから追加された仕様なのです。

 ASP.NETは、さらにその後から追加された技術です。しかし、広く普及しているHTML、DHTMLを変更することは出来ません。また、ASP.NETはサーバサイドとクライアントサイドに分かれており、サーバサイドをWindowsアプリケーションライクに開発するための技術です。したがって、クライアントサイドの動作には、まったく手が入っていません。なぜなら、勝手に拡張しても、対応するブラウザがないからです。スクリプトを解釈し、実行しているのはブラウザです。

 そういう前提で見ると、クライアントサイドには、「クリックされた」ことをサーバサイドに伝える機構はありません。DHTMLで拡張されたスクリプトで、クリックされたことを検知することは出来ます。しかし、インターネットが元々狭い帯域しか持たないことを思い出してください。狭い帯域で、Windowsアプリケーションが発生させるのと同じイベントを、サーバに伝えることは、とてもコストがかかります。
 このコストの問題は、帯域が広くなった現在でも同じです。@ITさんはよく「データベースの調整中です」が発生しますが(^-^;、トラフィックの状態によってサーバ、回線、クライアントのどこかで異常が発生し、データがロストすることを常に考えなければなりません。そうすると、出来るだけ通信量を減らすことが、安定したアプリケーションの作成につながると思います。

_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-25 00:43
引用:
ListBoxでSelectedIndexChangedのアクションを用いておりますが、
既に選択されているItemをもう一度選択した場合、ポストバックが発生しません。

引用:
次にクライアントが@ヤマダを選択するとAutoPostBackで以下のメソッドが実行されます
ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{}

まず、ListBox(SELECTだけど)で選択したときに自動的にポストバックされることと
SelectedIndexChangedイベントは直接関係ありません。(前者がAutoPostBackです。)

引用:
なお、この件はASP:ListBoxにondblclickを付与し、javascriptのfunctionを呼び出し、
そこで「__doPostBack(listbox1,null)」を記述することによって何とかなりました。
ポイントは選択されていないitemをダブルクリックしてもondblclickが起動しないところです。

先にAutoPostBack用のonchangeが走るからですかね?ところで、選択を変更するときは
シングルクリックでポストバックするのにここはondblclickでいいんですか?

引用:
さらにクライアントが既に選択されている@ヤマダを選択したところ、
POSTBACKもせず、当然ListBox1_SelectedIndexChangedメソッドも通りません。

どうにかして、同じ項目を選択しなおした場合もポストバックするようにしたとしても
きくちゃんさんの言うとおりイベントは発生しないでしょう。選択が変わっていないか
変わったかにかかわらず処理をさせたいのならPage_Loadのif(IsPostBack)のところで
処理するべきかと思います。

引用:
それなら、AutoPostBack をやめて、送信ボタンを横に置いた方が良いのではないかと思います。

最終的にAutoPostBackの実装をしたいとしても、動作を理解するためにしばらくはボタン
でやるのがいいと思います。
kick
会議室デビュー日: 2005/03/23
投稿数: 4
投稿日時: 2005-03-25 10:24
みなさん、ありがとうございます。問題も何とか解決し、とても勉強になりました

>あ、いや、だから、、、ん〜、まず、ベースとなっているインターネットを理解してください。
私の理解不足でした。会社では100ベース、家ではADSLで、ネットワークのリスクを全く考えていませんでした。(私がコーディングを始めた頃にブロードバンドが登場しました)クライアント上だけで動かすスクリプトと、クライアント(ブラウザ依存のスクリプト)とサーバーで2元的に処理するASP.NETを混同している部分があったと思います。とても参考になりました。

>それなら、AutoPostBack をやめて、送信ボタンを横に置いた方が良いのではないかと
テストプログラムならそうだと思いますが、ユーザー要件なのです。。。
@リストボックス選択⇒Aボタンクリック という2オペレーションが面倒なので、それは絶対だめとのことです。こういう事態は良くありますね。(たいていユーザの勝ち)

>シングルクリックでポストバックするのにここはondblclickでいいんですか?
厳密にはだめです。妥協点を見出した結果ここで落としました。

>Page_Loadのif(IsPostBack)のところで処理するべきかと思います。
その通りで、ondblclickでhiddenvalue設定⇒submit⇒IsPostBackでhiddenvalueが存在したら、SelectedIndexChangedメソッドを呼ぶようにしたところうまくできました。

>まず、ListBox(SELECTだけど)で選択したときに自動的にポストバックされることと
>SelectedIndexChangedイベントは直接関係ありません。(前者がAutoPostBackです。)
SelectedIndexChangedイベントはイベントハンドラに記述されているからですね。
記述があいまいで申し訳ありませんでした。
1

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