- - PR -
コントロール配列のイベント発生について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-04 14:09
DropDownListのイベントの発生について教えてください。
DropDownListを10こ、予めフォームに貼り付けてあり、 それらをコントロール配列っぽく使うため、 DropDownList型の配列変数を持ち、そこに格納します。 そしてAddHandlerでSelectedIndexChangedイベントを 予め作ってあるCmbClickイベントとして発生するよう 設定しています。 わたしの書いているソースは以下です。 ここから------------------------------------ '変数の定義 Public Shared CmbAry() As WebControls.DropDownList Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' ページを初期化するユーザー コードをここに挿入します。 If Not IsPostBack Then '配列をつくる Call CtlAryMke() End If End Sub Private Sub CtlAryMke() ReDim CmbAry(9) For cnt As Integer = 0 To 9 CmbAry(cnt) = Me.FindControl("DropDownList" & cnt + 1) AddHandler CmbAry(cnt).SelectedIndexChanged, New EventHandler(AddressOf CmbClick) Next End Sub Private Sub CmbClick(ByVal sender As Object, ByVal e As System.EventArgs) Me.Label1.Text = "にんしき" End Sub ここまで------------------------------------ 自分では上記説明のようにコードを書いているつもりですが、 ページロードは動いているのですが、 イベントが発生していません。 このコードの間違っている点や、 こうしたらできますという書き方等 何か教えてくださるかたがいましたら お返事いただけると助かります。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2007-06-04 14:16
この記事は参考にはなりませんか? # VB2005で記述していますが、Webも同じではないかと思います。 http://www.atmarkit.co.jp/fdotnet/vblab/vb2005m_02/vb2005m_02_01.html | ||||||||||||
|
投稿日時: 2007-06-04 14:38
CmbClickの Handlesに,(カンマ)で区切って複数のイベントを書けば良いです。
あと、配列のように扱うのは問題ないんですが、CmbAry変数をSharedにしてはいけません。 Sharedキーワードが付いたものはアプリケーション全体で1つの変数を共有することになります。 Webの場合はアプリケーションはサーバーに1つだけですので、ユーザー全員が同じ変数を共有することになります。
こんな感じでプロパティにしたりするとおしゃれですよね。 ちなみにコンパイルして試してはいないので文法間違いなどがあるかも。 [ メッセージ編集済み 編集者: 一郎 編集日時 2007-06-04 14:41 ] | ||||||||||||
|
投稿日時: 2007-06-04 14:51
VB.NETの事はよく知らないけど、
って書いてもいいの? MSDN見ると、
ってなってるけど....。 ここは問題ないと仮定して(誰も突っ込んでないし)、 CtlAryMkeが呼ばれていることは、デバッガで確認しているんですよね。 CtlAryMkeに入らないと、イベントハンドラをセットできないので。 | ||||||||||||
|
投稿日時: 2007-06-04 15:00
お返事ありがとうございますm(__)m
YASUYOKAさん> 情報ありがとうございます。 そのほかにもためになるページがありそうなので もう少し探してみます。 一郎さん> 変数等ご指摘ありがとうございます。 プロパティの使い方がまだちょっとわからないので 参考にしながら勉強してみます。 かずくんさん> お返事ありがとうございます。 ネットで検索してみたところ同じような内容があって 参考にしつつ書いてみました。もう少し調べてみます。 質問いただきました、関数が呼ばれているか、ですが、 それはデバッグで確認してみたので大丈夫だと思います。 皆さんのお返事を参考にしながら がんばってみます。 ありがとうございます。 | ||||||||||||
|
投稿日時: 2007-06-04 15:11
後者は一種の型推論機構です。この両者は同義になります。 以下オフトピ。 何故こんな型推論機構が用意されたかと言うと、VB.NET ではイベントの定義を Event Hoge(sender As Object, e As EventArgs) と言う風に記述できるからと思われます。 // C# では等価の記述はできません。 このイベントは一見 System.EventHandler 型に見えますが、実際には System.EventHandler とは何の関係も無く、そのクラス内で暗黙に定義される独自のデリゲート型を利用しています。 暗黙に定義されるのでプログラム上から型を指定できないため、デリゲートインスタンスの New も書けません。 そういうわけで、AddHandler において型推論機構が必要になったんでしょう。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2007-06-04 15:45 ] | ||||||||||||
|
投稿日時: 2007-06-04 15:21
Hongliangさん>
お返事ありがとうございます。 同じ意味なんですね。 詳しい説明については少し難しいので すぐにわかりました!とは言えないですが、 勉強になります。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2007-06-04 16:02
「イベントが発生していません」といっているのは、どのタイミングですか?というのも
Pageのインスタンスはアクセスするごとに別物になりますので初回に設定したハンドラが ポストバック時に残っているということはないですよ。 |