- PR -

ComboBoxのSelectedIndexChangedとSelectionChangeCommittedについて

1
投稿者投稿内容
アキミ
常連さん
会議室デビュー日: 2003/05/30
投稿数: 21
投稿日時: 2004-02-10 23:17
表題が長くて申し訳ありません。
タイトルのイベントに疑問があり、投稿させて頂きます。

疑問とは、SelectedIndexChangedの発生条件です。SelectedIndexChangedはComboBoxのインデックスが変更された際に発生します。このため、Webサービスなどから取得したDataSetを結合した時や、DisplayMemberプロパティに値を割り当てたときなどにも発生します。そのため、下記のようなコードでは何度もSelectedIndexChangedイベントが発生してしまいます。

コード:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'XMLWebサービスのインスタンスを生成
Me.myService = New jp.co.hogehoge.www.Service
'DataSetを取得
Dim myDS As DataSet = myService.GetXML

'コンボボックスに関連付け
Me.cmbData1.DataSource = myDS.Tables(0)
Me.cmbData1.DisplayMember = "Text"
Me.cmbData1.ValueMember = "Value"

End Sub

Private Sub cmbHoshuKasho_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbHoshuKasho.SelectedIndexChanged
'なんかの処理
End Sub



上記の例ですと、cmbData1にDataSourceを割り当てた時・DisplayMemberにプロパティを与えたときに発生します。何度も呼び出してしまうのです。

対策として「SelectionChangeCommitted」イベントを使用したのですが、SelectionChangeCommittedイベントはIndexを変化させずにComboBoxのItemをクリックしただけで発生してしまいます(そんなには困らないのですが…。

SelectedIndexChangedが発生するのもわかります。実際、なにもバインドされてない状態では-1だったのが0に変化するのですから、イベントは発生すると思います。コード内でデータのバインドを行うような場合は致し方ないのでしょうか?

なんか、大きな勘違いをしているような…という気がするため質問させて頂きます。なにかヒント等ありましたら、ご教授いただけますでしょうか。よろしくお願い致します。

[ メッセージ編集済み 編集者: アキミ 編集日時 2004-02-11 00:00 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-02-11 11:00
アキミさん、こんにちは。

引用:

DataSetを結合した時や、DisplayMemberプロパティに値を割り当てたときなどにも発生します。そのため、下記のようなコードでは何度もSelectedIndexChangedイベントが発生してしまいます。


イベントとイベントハンドラの関連付けを、動的に(というのかな?)行っては如何でしょうか。
必要に応じて AddHandler で登録、RemoveHandler で解除を行えば、イベントハンドラの呼び出しを制御できます。
アキミ
常連さん
会議室デビュー日: 2003/05/30
投稿数: 21
投稿日時: 2004-02-12 22:04
きくちゃんさん、こんばんわ。
返信が遅くなってすいません。

なるほど!
確かに、バインド前にイベントを剥がして、バインド後にイベントを
貼り付ければOKですね。全然気がつきませんでした。

さっそく、やってみようと思います。
ありがとうございました!
1

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