- - PR -
コンボボックスのイベントについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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で行ったも 同じ結果になりました。 要は純粋にコンボボックスの中身が変更されたらと言うイベントを取得したいのですが どれを使ってやったらいいか、ご教授願います。 | ||||
|
投稿日時: 2007-01-31 18:18
わかりにくいので、現象が確認できるミニマム コードを提示して頂けませんか?
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-31 18:25
InitializeComponent内で、ComboBoxAを設定している時に、Textなりをセットしているのではないかと思います。
| ||||
|
投稿日時: 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-31 23:18
こんばんは。
提示されたコードの中にはありません。 2003でしたら、" Windows フォーム デザイナで生成されたコード "を開いた中に。 2005でしたら、Designer.vbの中にあります。 デザインを見た時にComboBoxに文字が表示されていたら、消してみてください。 | ||||
|
投稿日時: 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 とありますが、このフォームを呼び出す時、コンボボックスにこれらをセットする際に イベントとしてひっかかってしまうと言う事でしょうか? | ||||
|
投稿日時: 2007-02-02 12:22
ステップ実行すれば、実際に確かめられるでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-02-02 13:20
ステップ実行して確かめてみました結果、
InitializeComponent内での処理は デバック開始時以外は処理を通らない事がわかりました。 … あ!、分かりました。 原因はフォームロード時に自分のコードでコンボボックスに値を設定していた為、 これがイベントの引っかかる原因になっていたようです。 のでイベントでひっかかっても意図しないタイミングの場合は 処理を抜けるように制御を加えようと思います。 なるほど、イベントハンドラでオブジェクトの値が変わった と言う情報は実際にマウスやキーボード操作によって行われた場合以外に、 プログラム内部で値を変更した場合にも反応する事がわかりました。 じゃんぬねっとさん、シュリさんありがとうございました。 |
1