- - PR -
ListBoxでのSelectedIndexChangedイベントの動作について
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-03 20:46
だぁかぁらぁ。。。
イベント発生させるのは、Form がクローズすることではなく、 SelectedIndex が変わるとき なんです。これは、間違いないのです。 で、今調べなければならないのは、 フォームがクローズするときに、SelectedIndex を変えるか ではないですか? 「変わるか」ではなく、「変えるか」。 あなたの質問では、「Form が閉じるというアクションが SelectedIndexChanged イベントを発生させている」と考えていらっしゃるように思えます。 私は、それに対しては「NO!」と答えます。 しかし、何らかの理由で SelectedIndex が変わることで、SelectedIndexChanged イベントが発生していることは、考えられます。 Form が閉じるというアクションが、なぜ SelectedIndex を変えるかということを知ることで、もしかしたら ComboBox や DataGridView などの選択肢を持ったコントロールでも同じことが発生するかもしれないと、推測できるでしょ? 現象にこだわっていると、他の現象に応用できません。 現象を引き起こす理由を知ることで、他の現象に対して応用できます。 「そんな応用ができる必要はない」とおっしゃるなら、これで終わりにしましょう。 しかし私は、その応用ができることで、「次回以降の開発が楽になる」と思います。 | ||||||||||||||||||||
|
投稿日時: 2007-11-03 21:40
ああ、DataBind しているのね。 たぶん、これ。 バインドさせると動作が変わるかな?と思ったので、「デザイナでアイテムを追加しました。」と書いたわけですけど。 おそらく、バインドを外すという処理が走って、そこから SelectedIndex が変わり、イベントが励起されていると思います。 なので、呼び出し履歴を見ていただければ、それっぽい名前のメソッドを通っていると思います。 それを確認していただきたいのですが、難しいですか? ### あと、テストって、必ず選択してからフォームを閉じていますよね? 何も選択していない状態でフォームを閉じたりしていないですよね? これも、発生しないはずなんですよ。 そういうところも、テストが足りないと思います。 | ||||||||||||||||||||
|
投稿日時: 2007-11-04 09:08
Jittaさん、私の理解不足で大変お手数を掛け申し訳ありません。
とのコメントを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
このことについても私は理解できづ、こまっています。SelectedIndexChangedは読んで 字のごとくIndexが変化した時に(後に)発生し、フォームクローズ時に何かの原因で Indexが変化しているのではないのでしょうか。もしかしてJittaさんは フォームクローズ →(A現象)→(B現象)→Indexの変化 の→(A現象)→(B現象)を調べろとおっしゃっておられるのでしょうか
この件につきましては、以前報告(下記)しました通りです。ちなみに何も選択してい ない状態でフォームを閉じても結果は同じ現象が発生しています。
以上、Jittaさんには大変ご迷惑をおかけいたしましたが、ListBoxのアイテム設定に DataSourceを使ってテーブルを設定した場合は、フォームのクローズ時に SelectedIndexChangedイベントが発生すし、そのときのSelectedItemは-1を返し、 SelectedValueはNullが返されると言えそうです。 Jittaさん、あとは私自身で勉強します。ありがとうございました。 追記 ComboBox や DataGridView も当然同様な動きをするものと考えテストしてみますと、 全く同じ結果でした。(DataGridViewのComboBoxはテストしていませんので、後日 報告します。) [ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-04 09:11 ] | ||||||||||||||||||||
|
投稿日時: 2007-11-04 10:53
ListBoxのDataSourceをDisposeしてる関係でSelectedIndexが変化してるっぽいことが わかりましたよ。 | ||||||||||||||||||||
|
投稿日時: 2007-11-04 15:55
ごめん。 「呼び出し履歴」がわからないのね。 そういう名前のウインドウがあるんだけどなぁ。。。 | ||||||||||||||||||||
|
投稿日時: 2007-11-04 16:17
べるさん、ありがとうございました。
私はStackTraceを取っていませんので内容はわりませんが、SelectedIndexが変化してい ることは、ListBoxの選択でSelectedIndexの返値が 0や1,2・・・と正常に表示され フォームクローズ時に返値が -1となっておりますので事実として確認できております。 当初からの私の質問は、フォームを閉じる時にSelectedIndexChangedイベントが発生 する現象はSelectedIndexChangedイベントの仕様通りで正常な動作なのでしょうか。 もし仕様通りで正常な動作であるならリスト項目を選択してIndexを変化させていない のにクローズしただけで勝手にSelectedIndex値が -1に変化してイベントが発生するのでしょうか。と言う単純な疑問でした。 ところが私の知識不足から複雑な内容になってしまい、皆様にご迷惑をおかけすること になってしまいました。この場を借りてお詫び申し上げます。 この件に関しては私なりに十分理解できましたので今後は自分でテストしながら勉強します。 本当に皆様、ありがとうございました。 | ||||||||||||||||||||
|
投稿日時: 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 ] | ||||||||||||||||||||
|
投稿日時: 2007-11-04 22:05
MessageBox.Show((new System.Diagnostics.StackTrace()).ToString()); としていました。
ListBoxの仕様に「Formを○○したら〜」というのは定義されないでしょう。 ((BindingSource)listBox1.DataSource).Dispose(); これでも発生すると思います。
|