- PR -

コントロール配列のイベント発生について

投稿者投稿内容
ちぇび
常連さん
会議室デビュー日: 2005/12/26
投稿数: 28
投稿日時: 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
ここまで------------------------------------

自分では上記説明のようにコードを書いているつもりですが、
ページロードは動いているのですが、
イベントが発生していません。

このコードの間違っている点や、
こうしたらできますという書き方等
何か教えてくださるかたがいましたら
お返事いただけると助かります。

よろしくお願いします。
YASUYOKA
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 71
投稿日時: 2007-06-04 14:16
引用:

ちぇびさんの書き込み (2007-06-04 14:09) より:
DropDownListのイベントの発生について教えてください。
DropDownListを10こ、予めフォームに貼り付けてあり、
それらをコントロール配列っぽく使うため、
DropDownList型の配列変数を持ち、そこに格納します。
そしてAddHandlerでSelectedIndexChangedイベントを
予め作ってあるCmbClickイベントとして発生するよう
設定しています。



この記事は参考にはなりませんか?
# VB2005で記述していますが、Webも同じではないかと思います。
http://www.atmarkit.co.jp/fdotnet/vblab/vb2005m_02/vb2005m_02_01.html
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-04 14:38
CmbClickの Handlesに,(カンマ)で区切って複数のイベントを書けば良いです。

あと、配列のように扱うのは問題ないんですが、CmbAry変数をSharedにしてはいけません。
Sharedキーワードが付いたものはアプリケーション全体で1つの変数を共有することになります。
Webの場合はアプリケーションはサーバーに1つだけですので、ユーザー全員が同じ変数を共有することになります。
コード:

Private _CmbAry As DropDownList()

Public Readonly Property CmbAry As DropDownList()
Get
If _CmbAry Is Nothing Then
_CmbAry = New DropDownList(){DropDownList1, DropDownList2, DropDownList3…}
End If
Return _CmbAry
End Get
End Property


こんな感じでプロパティにしたりするとおしゃれですよね。
ちなみにコンパイルして試してはいないので文法間違いなどがあるかも。

[ メッセージ編集済み 編集者: 一郎 編集日時 2007-06-04 14:41 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-06-04 14:51
VB.NETの事はよく知らないけど、
コード:
AddHandler CmbAry(cnt).SelectedIndexChanged, New EventHandler(AddressOf CmbClick)


って書いてもいいの?
MSDN見ると、
コード:
AddHandler event, AddressOf eventhandler


ってなってるけど....。

ここは問題ないと仮定して(誰も突っ込んでないし)、
CtlAryMkeが呼ばれていることは、デバッガで確認しているんですよね。
CtlAryMkeに入らないと、イベントハンドラをセットできないので。
ちぇび
常連さん
会議室デビュー日: 2005/12/26
投稿数: 28
投稿日時: 2007-06-04 15:00
お返事ありがとうございますm(__)m

YASUYOKAさん>
情報ありがとうございます。
そのほかにもためになるページがありそうなので
もう少し探してみます。

一郎さん>
変数等ご指摘ありがとうございます。
プロパティの使い方がまだちょっとわからないので
参考にしながら勉強してみます。

かずくんさん>
お返事ありがとうございます。
ネットで検索してみたところ同じような内容があって
参考にしつつ書いてみました。もう少し調べてみます。
質問いただきました、関数が呼ばれているか、ですが、
それはデバッグで確認してみたので大丈夫だと思います。

皆さんのお返事を参考にしながら
がんばってみます。
ありがとうございます。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-06-04 15:11
引用:

コード:

AddHandler CmbAry(cnt).SelectedIndexChanged, New EventHandler(AddressOf CmbClick)


って書いてもいいの?
MSDN見ると、
コード:

AddHandler event, AddressOf eventhandler


ってなってるけど....。



後者は一種の型推論機構です。この両者は同義になります。

以下オフトピ。
何故こんな型推論機構が用意されたかと言うと、VB.NET ではイベントの定義を
Event Hoge(sender As Object, e As EventArgs)
と言う風に記述できるからと思われます。
// C# では等価の記述はできません。
このイベントは一見 System.EventHandler 型に見えますが、実際には System.EventHandler とは何の関係も無く、そのクラス内で暗黙に定義される独自のデリゲート型を利用しています。
暗黙に定義されるのでプログラム上から型を指定できないため、デリゲートインスタンスの New も書けません。
そういうわけで、AddHandler において型推論機構が必要になったんでしょう。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2007-06-04 15:45 ]
ちぇび
常連さん
会議室デビュー日: 2005/12/26
投稿数: 28
投稿日時: 2007-06-04 15:21
Hongliangさん>
お返事ありがとうございます。
同じ意味なんですね。
詳しい説明については少し難しいので
すぐにわかりました!とは言えないですが、
勉強になります。

ありがとうございました。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-06-04 16:02
「イベントが発生していません」といっているのは、どのタイミングですか?というのも

引用:
If Not IsPostBack Then
'配列をつくる
Call CtlAryMke()
End If

これだと、ポストバック時にはハンドラが設定されないですよね。
Pageのインスタンスはアクセスするごとに別物になりますので初回に設定したハンドラが
ポストバック時に残っているということはないですよ。

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