- - PR -
ASP.NETでのListBoxにOnClickを付けたい
1
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-23 10:34
はじめまして。
ASP.NET(C#)でListBoxを使用しております。 ListBoxでSelectedIndexChangedのアクションを用いておりますが、 既に選択されているItemをもう一度選択した場合、ポストバックが発生しません。 ListBoxにOnclick属性を付けて、htmlの隠し引数を設定し、サーバーにポストバック (submit()し、隠し引数の値によって、イベントを振り分けることによって、 何とか動かすことには成功したのですが、もう少しスマートにやる方法はないでしょうか 現在はイベント定義で何とかする方法を模索中です。 | ||||||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||||||
|
投稿日時: 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を開発しようとすると不可欠だと考えています。 | ||||||||||||||||||||
|
投稿日時: 2005-03-24 10:02
kickさん、お早うございます。
選択されているインデックスが変わってないのだから、当然、イベントは発生しませんよね?
併用が良くないというのは誤解です。 何でもかんでもユーザの言う事を聞いて標準から外れた事を無理矢理、実現すると、思わぬところでハマったりするかも知れません。HTMLに出来る事なんてたかが知れてます。 それなら、AutoPostBack をやめて、送信ボタンを横に置いた方が良いのではないかと思います。 | ||||||||||||||||||||
|
投稿日時: 2005-03-24 21:16
あ、いや、だから、、、ん〜、まず、ベースとなっているインターネットを理解してください。
インターネットは、今お使いのものは100ベースであったりギガベースであるかもしれません。しかし、開発された当初はもっと帯域の狭いものでした。 また、HTMLはHyper Text Markup Languageの略であり、テキストを修飾することが目的の言語です。したがって、テキストを選択するだの、その上でクリックするだのは、もっと後になってから追加された仕様なのです。 ASP.NETは、さらにその後から追加された技術です。しかし、広く普及しているHTML、DHTMLを変更することは出来ません。また、ASP.NETはサーバサイドとクライアントサイドに分かれており、サーバサイドをWindowsアプリケーションライクに開発するための技術です。したがって、クライアントサイドの動作には、まったく手が入っていません。なぜなら、勝手に拡張しても、対応するブラウザがないからです。スクリプトを解釈し、実行しているのはブラウザです。 そういう前提で見ると、クライアントサイドには、「クリックされた」ことをサーバサイドに伝える機構はありません。DHTMLで拡張されたスクリプトで、クリックされたことを検知することは出来ます。しかし、インターネットが元々狭い帯域しか持たないことを思い出してください。狭い帯域で、Windowsアプリケーションが発生させるのと同じイベントを、サーバに伝えることは、とてもコストがかかります。 このコストの問題は、帯域が広くなった現在でも同じです。@ITさんはよく「データベースの調整中です」が発生しますが(^-^;、トラフィックの状態によってサーバ、回線、クライアントのどこかで異常が発生し、データがロストすることを常に考えなければなりません。そうすると、出来るだけ通信量を減らすことが、安定したアプリケーションの作成につながると思います。 _________________ | ||||||||||||||||||||
|
投稿日時: 2005-03-25 00:43
SelectedIndexChangedイベントは直接関係ありません。(前者がAutoPostBackです。)
シングルクリックでポストバックするのにここはondblclickでいいんですか?
きくちゃんさんの言うとおりイベントは発生しないでしょう。選択が変わっていないか 変わったかにかかわらず処理をさせたいのならPage_Loadのif(IsPostBack)のところで 処理するべきかと思います。
でやるのがいいと思います。 | ||||||||||||||||||||
|
投稿日時: 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