- PR -

コンボボックスのイベントについて

1
投稿者投稿内容
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2007-01-31 17:32
使用オブジェクト
ラジオボタンA、ラジオボタンB
グループボックス
コンボボックスA、コンボボックスB
仕様
グループボックスの中にコンボボックスA、コンボボックスB
とがそれぞれあり、
ラジオボタンAを選択するとグループボックスを非活性に、
ラジオボタンBを選択するとグループボックスを活性にする
コンボボックスAの値を変更したらそれを受けてコンボボックスBの値を
設定する
画面ロード時にはラジオボタンAが選択されている状態にする
といった内容のものを作りたかったのですが、
「コンボボックスAの値が変更されたら」のイベントを
TextChangedで拾おうとしたら
何故かラジオボタンAを選択した際に
CheckedChanged(ラジオボタンの選択がされた時の処理)よりも早く
TextChangedの方に入ってしまいました。
つまり、ラジオボタン選択しただけなのにコンボボックスの値が変わったらの処理
に行ってしまったと言う事。

しかし、一旦処理を流してもう一度ラジオボタンA→ラジオボタンBとやると
今度はTextChangedに入らず、CheckedChangedを通って
コンボボックスAの値を変えて初めてTextChangedの処理に入りました。
(後述の場合が期待している処理の流れ)

TextChangedの他に、SelectedIndexChangedやSelectedValueChangedで行ったも
同じ結果になりました。

要は純粋にコンボボックスの中身が変更されたらと言うイベントを取得したいのですが
どれを使ってやったらいいか、ご教授願います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-31 18:18
わかりにくいので、現象が確認できるミニマム コードを提示して頂けませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
シュリ
会議室デビュー日: 2007/01/29
投稿数: 15
投稿日時: 2007-01-31 18:25
InitializeComponent内で、ComboBoxAを設定している時に、Textなりをセットしているのではないかと思います。
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2007-01-31 19:25
現象が確認出来るコードです。

フォームの直下に以下の記述をしています。
'ラジオボタンAを選択した場合
Private Sub rdbZenken_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbZenken.CheckedChanged

    'グループボックスを非活性にして、コンボボックスA,Bのテキストを初期化する
Me.grpHyouji.Enabled = False
Me.cmbJigyousho.Text = ""
Me.cmbBumon.Text = ""
End Sub

'ラジオボタンBを選択した場合
Private Sub rdbJouken_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbJouken.CheckedChanged

    'グループボックスとコンボボックスAを活性にする
Me.grpHyouji.Enabled = True
Me.cmbJigyousho.Enabled = True
End Sub

'コンボボックスAの値を変更する場合
Private Sub cmbJigyousho_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbJigyousho.TextChanged

'部門コンボボックスの設定(コンボボックスBに値を設定する処理)
Me.smMakeCombBox(True)
End Sub

↑の状態でラジオボタンB(rdbJouken)を選択時に
rdbJouken_CheckedChanged
に行かずに
cmbJigyousho_TextChanged
に行ってしまうという事です。

因みにコンボボックスA(cmbJigyousho)とコンボボックスB(cmbBumon)は
グループボックス(grpHyouji)上に配置しています。

InitializeComponent内での処理と言うと上記で言うと何処にあたるのでしょうか?
rdbZenken_CheckedChanged処理内でコンボボックスのテキストを初期化している部分が
問題だと言う事でしょうか?
シュリ
会議室デビュー日: 2007/01/29
投稿数: 15
投稿日時: 2007-01-31 23:18
こんばんは。
提示されたコードの中にはありません。

2003でしたら、" Windows フォーム デザイナで生成されたコード "を開いた中に。
2005でしたら、Designer.vbの中にあります。

デザインを見た時にComboBoxに文字が表示されていたら、消してみてください。
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2007-02-02 11:35
ありました。

'cmbJigyousho
'
Me.cmbJigyousho.Enabled = False
Me.cmbJigyousho.Location = New System.Drawing.Point(80, 12)
Me.cmbJigyousho.Name = "cmbJigyousho"
Me.cmbJigyousho.Size = New System.Drawing.Size(280, 20)
Me.cmbJigyousho.Sorted = True
Me.cmbJigyousho.TabIndex = 6

とありますが、このフォームを呼び出す時、コンボボックスにこれらをセットする際に
イベントとしてひっかかってしまうと言う事でしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-02 12:22
引用:

エドさんの書き込み (2007-02-02 11:35) より:

とありますが、このフォームを呼び出す時、コンボボックスにこれらをセットする際に
イベントとしてひっかかってしまうと言う事でしょうか?


ステップ実行すれば、実際に確かめられるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2007-02-02 13:20
ステップ実行して確かめてみました結果、
InitializeComponent内での処理は
デバック開始時以外は処理を通らない事がわかりました。

あ!、分かりました。
原因はフォームロード時に自分のコードでコンボボックスに値を設定していた為、
これがイベントの引っかかる原因になっていたようです。
のでイベントでひっかかっても意図しないタイミングの場合は
処理を抜けるように制御を加えようと思います。

なるほど、イベントハンドラでオブジェクトの値が変わった
と言う情報は実際にマウスやキーボード操作によって行われた場合以外に、
プログラム内部で値を変更した場合にも反応する事がわかりました。

じゃんぬねっとさん、シュリさんありがとうございました。


1

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