プロが教える店舗&オフィスのセキュリティ対策術

おはようございます。
VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。
(用語の使い方などが間違っているかもしれません。おかしなところは指摘していただけるとありがたいです)

実行時に動的(?)に作成されたComboBoxをイベントハンドラへ関連付けようとしているのですが、ClickやLeaveなどで関連づけると正常に動作するのにTextChangedの場合になぜか認識してもらえません。
原因の見当がまったくつかず、困り果てています。

内容は、まずボタンを押すとコンボボックスが2つずつ追加されます。そのコンボボックスのリストを選ぶ際、追加されたふたつが同じものを選んでいると色が変わるようにするものです。

下にそのソースを簡潔にしたサンプルを記述させていただきます。
間違いの指摘や、うまくいかない原因、アドバイスなど頂ければ幸いです。


(formにはButton1というボタンが一つだけあります。)

Dim Index As Integer

Private CBox1() As ComboBox
Private CBox2() As ComboBox

Private Sub CBB_LT_SameErroCheck(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim T As Integer

T = sender.Tag
If CBox1(T).Text = "" Then
Exit Sub
End If
If CBox1(T).Text = CBox2(T).Text Then
CBox1(T).BackColor = Color.Red
CBox2(T).BackColor = Color.Red
Else
CBox1(T).BackColor = Color.White
CBox2(T).BackColor = Color.White
End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

ReDim Preserve CBox1(Index)
ReDim Preserve CBox2(Index)

SuspendLayout()

CBox1(Index) = New ComboBox
CBox2(Index) = New ComboBox

With CBox1(Index)
.Location = New Point(105, Index * 20)
.Size = New Size(95, 20)
.DropDownStyle = ComboBoxStyle.DropDownList
.Tag = Index
.Items.Add("List1")
.Items.Add("List2")
End With
With CBox2(Index)
.Location = New Point(200, Index * 20)
.Size = New Size(95, 20)
.DropDownStyle = ComboBoxStyle.DropDownList
.Tag = Index
.Items.Add("List1")
.Items.Add("List2")
End With

'AddHandler CBox1(Index).Click, AddressOf CBB_LT_SameErroCheck
'AddHandler CBox2(Index).Click, AddressOf CBB_LT_SameErroCheck
AddHandler CBox1(Index).TextChanged, AddressOf CBB_LT_SameErroCheck
AddHandler CBox2(Index).TextChanged, AddressOf CBB_LT_SameErroCheck

Me.Controls.Add(CBox1(Index))
Me.Controls.Add(CBox2(Index))

ResumeLayout(False)

Index += 1

End Sub

A 回答 (3件)

まずは関係ない話から。


Option Strict Onの時,
>T = sender.Tag
(T:Integer,sender:Object,ObjectはTagプロパティを持たないから駄目だろと怒られた。
そのため、当方環境での検証において
該当部分を
T = DirectCast((DirectCast(sender, ComboBox)).Tag, Integer)
と置き換えた。なお,System.Windows.Forms名前空間が読み込まれていない場合,System.Windows.Forms.ComboBoxと記述する必要がある。
======
まだ読んでいる途中です。

ComboBoxStyle.DropDownListの場合,TextChangedは発生しないんだとか何とか。ComboBoxStyle.DropDownの場合,当方環境で発生が確認できた。

変わりにSelectedIndexChangedやSelectedValueChangedを使えとさ。

http://forums.microsoft.com/MSDN/ShowPost.aspx?P …
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
    • good
    • 0
この回答へのお礼

お早いご返信ありがとうございます。
仰るとおり、SelectedValueChangedを使ったところ思い通りの動作をしてくれました!助かりました!

しかし解せないのが、ComboBoxStyle.DropDownListをデザイン時に配置しデザイン時にTextChangedイベントハンドラへ関連付けした場合と、デザイン時に配置したものを実行時にイベントハンドラへ関連付けした場合は何故か上手く動いたんです。
コントロールを実行時に動的に追加した場合のみこのような事になってしまったので余計に悩んでしまっておりました。

いくつか上げていただいた参考記事(英語は読めませんでした・・・)に似たような事が書いてありましたが、バグなんでしょうか。

何はともあれ、解決法を導いてくださった事、感謝いたします。
ありがとうございます。

お礼日時:2007/05/05 14:38

>しかし解せないのが、(中略)デザイン時に配置したものを実行時にイベントハンドラへ関連付けした場合は何故か上手く動いたんです



再現しました。なんじゃこりゃ!?
解決策にいたらず申し訳ないですが,一応再現報告はしておきます。

俺自身も更なる識者の回答を待ちたいと思います
    • good
    • 0
この回答へのお礼

>解決策にいたらず申し訳ないですが,

とんでもないです。
ご教授いただいた方法でプログラム自体は正常に動かすことができるようになり、現在は順調に作業が進められています。
その上、再現をし確認までしてくださった事、とても感謝しております。

今回の件の根本的な原因について、何かご存知の方がいらっしゃるかもしれませんので、しばらくこの質問は締め切らずに置いてみようかと思います。
お互い有益な情報が得られることを祈って、しばし待ちましょう。

ご返信ありがとうございました。

お礼日時:2007/05/05 19:22

二つ追記。



●当方の環境では
Forumで述べられている「マウスによる操作」によっても
TextChangedイベントは発生していませんでした。

●CBB_LT_SameErrorCheckでなく
CBB_LT_SameErroCheckなのは
意図的ですか?
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
CBB_LT_SameErrorCheckが正しく、「r」が抜けているのは私のタイプミスでした。
幸い、今回はこれに起因する問題は発生しなかったようですが、タイプミスなどの単純な誤りが問題になってしまう場面もあるかと思います。
今後はもっと気をつけるよう心がけます。

お礼日時:2007/05/05 14:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!