- PR -

ListBoxでのSelectedIndexChangedイベントの動作について

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-03 20:46
だぁかぁらぁ。。。
引用:

SelectedIndexChanged イベント ハンドラ内でブレークし、
呼び出し履歴を確認する必要があると思います。


引用:

SelectedIndexChanged イベント ハンドラ内でブレークし、
呼び出し履歴を確認する必要があると思います。


引用:

SelectedIndexChanged イベント ハンドラ内でブレークし、
呼び出し履歴を確認する必要があると思います。


引用:

SelectedIndexChanged イベント ハンドラ内でブレークし、
呼び出し履歴を確認する必要があると思います。



イベント発生させるのは、Form がクローズすることではなく、
SelectedIndex が変わるとき
なんです。これは、間違いないのです。

で、今調べなければならないのは、
フォームがクローズするときに、SelectedIndex を変えるか
ではないですか?
「変わるか」ではなく、「変えるか」。

 あなたの質問では、「Form が閉じるというアクションが SelectedIndexChanged イベントを発生させている」と考えていらっしゃるように思えます。
私は、それに対しては「NO!」と答えます。
しかし、何らかの理由で SelectedIndex が変わることで、SelectedIndexChanged イベントが発生していることは、考えられます。

 Form が閉じるというアクションが、なぜ SelectedIndex を変えるかということを知ることで、もしかしたら ComboBox や DataGridView などの選択肢を持ったコントロールでも同じことが発生するかもしれないと、推測できるでしょ?

 現象にこだわっていると、他の現象に応用できません。
現象を引き起こす理由を知ることで、他の現象に対して応用できます。


 「そんな応用ができる必要はない」とおっしゃるなら、これで終わりにしましょう。
しかし私は、その応用ができることで、「次回以降の開発が楽になる」と思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-03 21:40
引用:

だんじりさんの書き込み (2007-11-01 11:57) より:

テスト3.SelectedItem.ToStringは常に「System.Data.DataRowView」を返します。
ValueMemberを空に設定するとSelectedValueも「System.Data.DataRowView」となる。


ああ、DataBind しているのね。
たぶん、これ。
バインドさせると動作が変わるかな?と思ったので、「デザイナでアイテムを追加しました。」と書いたわけですけど。

おそらく、バインドを外すという処理が走って、そこから SelectedIndex が変わり、イベントが励起されていると思います。
なので、呼び出し履歴を見ていただければ、それっぽい名前のメソッドを通っていると思います。
それを確認していただきたいのですが、難しいですか?


###
あと、テストって、必ず選択してからフォームを閉じていますよね?
何も選択していない状態でフォームを閉じたりしていないですよね?
これも、発生しないはずなんですよ。
そういうところも、テストが足りないと思います。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-04 09:08
Jittaさん、私の理解不足で大変お手数を掛け申し訳ありません。
引用:

Jittaさんの書き込み (2007-11-03 20:46) より:
だぁかぁらぁ。。。
SelectedIndexChanged イベント ハンドラ内でブレークし、
呼び出し履歴を確認する必要があると思います。


とのコメントを4度も繰り替えられ、ご立腹のことと思いますが、ご指摘いただいた
ときに呼び出し履歴を調べましたが、ListBoxのアイテム選択時と同じメッセージで
それらしい情報はありませんでした。又今回も

引用:

なので、呼び出し履歴を見ていただければ、それっぽい名前のメソッドを通っていると思います。 それを確認していただきたいのですが、難しいですか?


との指摘を受けましたので、再度呼び出し履歴を調べました。以下アイテム選択時と
フォームクローズ時の両方を報告いたします。
>WindowsApplication1.exe!WindowsApplication1.Form1.ListBox1_SelectedIndexChanged(Object sender = {SelectedItem = "AAAA"}, System.EventArgs e = {System.EventArgs}) 行 18 Basic

>WindowsApplication1.exe!WindowsApplication1.Form1.ListBox1_SelectedIndexChanged(Object sender = {SelectedItem = ""}, System.EventArgs e = {System.EventArgs}) 行 18 Basic

引用:

イベント発生させるのは、Form がクローズすることではなく、SelectedIndex が
変わるとき
なんです。これは、間違いないのです。
で、今調べなければならないのは、
フォームがクローズするときに、SelectedIndex を変えるか
ではないですか?
「変わるか」ではなく、「変えるか」。

あなたの質問では、「Form が閉じるというアクションが SelectedIndexChanged
イベントを発生させている」と考えていらっしゃるように思えます。
私は、それに対しては「NO!」と答えます。
しかし、何らかの理由で SelectedIndex が変わることで、SelectedIndexChanged
イベントが発生していることは、考えられます。


このことについても私は理解できづ、こまっています。SelectedIndexChangedは読んで
字のごとくIndexが変化した時に(後に)発生し、フォームクローズ時に何かの原因で
Indexが変化しているのではないのでしょうか。もしかしてJittaさんは
フォームクローズ →(A現象)→(B現象)→Indexの変化
の→(A現象)→(B現象)を調べろとおっしゃっておられるのでしょうか

引用:

あと、テストって、必ず選択してからフォームを閉じていますよね?
何も選択していない状態でフォームを閉じたりしていないですよね?
これも、発生しないはずなんですよ。
そういうところも、テストが足りないと思います。



この件につきましては、以前報告(下記)しました通りです。ちなみに何も選択してい
ない状態でフォームを閉じても結果は同じ現象が発生しています。
引用:

以上の設定でデバッグしたところ、項目の選択では両方とも正常にSelectedIndex が
表示されました。
続いてフォームを画面右上の「×」で閉じるとListBox1だけが次のように表示され、
ListBox2 のMessageBoxは表示されません。
→「ListBox1_SelectedIndex: -1」



以上、Jittaさんには大変ご迷惑をおかけいたしましたが、ListBoxのアイテム設定に
DataSourceを使ってテーブルを設定した場合は、フォームのクローズ時に
SelectedIndexChangedイベントが発生すし、そのときのSelectedItemは-1を返し、
SelectedValueはNullが返されると言えそうです。
Jittaさん、あとは私自身で勉強します。ありがとうございました。


追記
ComboBox や DataGridView も当然同様な動きをするものと考えテストしてみますと、
全く同じ結果でした。(DataGridViewのComboBoxはテストしていませんので、後日
報告します。)














[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-04 09:11 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-11-04 10:53
引用:
とのコメントを4度も繰り替えられ、ご立腹のことと思いますが、ご指摘いただいた
ときに呼び出し履歴を調べましたが、ListBoxのアイテム選択時と同じメッセージで
それらしい情報はありませんでした。又今回も

そうですか?私はSelectedIndexChangedでStackTraceを出力してみましたが、
ListBoxのDataSourceをDisposeしてる関係でSelectedIndexが変化してるっぽいことが
わかりましたよ。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-04 15:55
引用:

だんじりさんの書き込み (2007-11-04 09:08) より:

引用:

なので、呼び出し履歴を見ていただければ、それっぽい名前のメソッドを通っていると思います。 それを確認していただきたいのですが、難しいですか?


との指摘を受けましたので、再度呼び出し履歴を調べました。以下アイテム選択時と
フォームクローズ時の両方を報告いたします。
>WindowsApplication1.exe!WindowsApplication1.Form1.ListBox1_SelectedIndexChanged(Object sender = {SelectedItem = "AAAA"}, System.EventArgs e = {System.EventArgs}) 行 18 Basic

>WindowsApplication1.exe!WindowsApplication1.Form1.ListBox1_SelectedIndexChanged(Object sender = {SelectedItem = ""}, System.EventArgs e = {System.EventArgs}) 行 18 Basic



ごめん。
「呼び出し履歴」がわからないのね。
そういう名前のウインドウがあるんだけどなぁ。。。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-04 16:17
べるさん、ありがとうございました。
私はStackTraceを取っていませんので内容はわりませんが、SelectedIndexが変化してい
ることは、ListBoxの選択でSelectedIndexの返値が 0や1,2・・・と正常に表示され
フォームクローズ時に返値が -1となっておりますので事実として確認できております。

当初からの私の質問は、フォームを閉じる時にSelectedIndexChangedイベントが発生
する現象はSelectedIndexChangedイベントの仕様通りで正常な動作なのでしょうか。
もし仕様通りで正常な動作であるならリスト項目を選択してIndexを変化させていない
のにクローズしただけで勝手にSelectedIndex値が -1に変化してイベントが発生するのでしょうか。と言う単純な疑問でした。

ところが私の知識不足から複雑な内容になってしまい、皆様にご迷惑をおかけすること
になってしまいました。この場を借りてお詫び申し上げます。
この件に関しては私なりに十分理解できましたので今後は自分でテストしながら勉強します。
本当に皆様、ありがとうございました。




だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-04 16:58
Jittaさん、いつもすみません。
Visual Basic 2005 Express Edition には[デバッグ]メニュー → [ウィンドウ]
→ [呼び出し履歴]ウインドウがあります。その内容は先に報告したとおりです。
Visual Basic 2005 Express Edition には、べるさんの言われるStackTraceを出力
できる機能はありません。Visual Basic 2005 Express Editionの[呼び出し履歴]に
関する仕様は、以下のURLをご覧下さい。
http://msdn2.microsoft.com/ja-jp/library/a3694ts5(VS.80).aspx




[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-04 20:01 ]

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-04 21:09 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-11-04 22:05
引用:
私はStackTraceを取っていませんので内容はわりませんが、

私はSelectedIndexChangedで
MessageBox.Show((new System.Diagnostics.StackTrace()).ToString());
としていました。

引用:
当初からの私の質問は、フォームを閉じる時にSelectedIndexChangedイベントが発生
する現象はSelectedIndexChangedイベントの仕様通りで正常な動作なのでしょうか。
もし仕様通りで正常な動作であるならリスト項目を選択してIndexを変化させていない
のにクローズしただけで勝手にSelectedIndex値が -1に変化してイベントが発生するのでしょうか。と言う単純な疑問でした。

この質問には違和感があります。
ListBoxの仕様に「Formを○○したら〜」というのは定義されないでしょう。

((BindingSource)listBox1.DataSource).Dispose();
これでも発生すると思います。

引用:
ところが私の知識不足から複雑な内容になってしまい、皆様にご迷惑をおかけすること
になってしまいました。この場を借りてお詫び申し上げます。

知識不足というか、この現象を体験せずに「発生する」と断言できる人はまあいないでしょう。

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