- - PR -
リストボックスの使い方について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-21 14:30
Visuai Basic 2005 Exprese Edition でWindowsアプリケーションを開発しています。
リストボックスの設定で SelectedValueプロパティの使い方がわからず、次のような テストを繰り返しています。その結果のエラーについて、よろしくご指導下さい。 1.以下のようなデータテーブル(OrderDetailsTable)を準備しました。 ______OrderID___ItemID___数量 ______ 4085 _______12_______1 ______ 4086 _______13_______3 2.フォームにOrderDetailsTable のOrderID、ItemID、数量の3項目を詳細表示した。 3.ListBox1 を追加配置し、プロパティを下記のように設定しました。 ______SekectedIndex → (なし) ______SelectedItem → (なし) ______SelectedValue→ (なし) ______DataSource → OrderDetailsTableBindingSource ______DisplayMember→ ItemID ______ValueMember → 空 4、動作確認のために4個のTextBox を追加設置し、ListBox1_SelectedIndexChanged イベントに下記のコードを記述しました。 ______TextBox1.Text = ListBox1.SelectedIndex.ToString ______TextBox2.Text = ListBox1.SelectedItem.ToString ______TextBox3.Text = Me.ListBox1.SelectedValue.ToString ______TextBox4.Text = ListBox1.Text.ToString 以上の内容でデバッグしますと TextBox には次のように表示され、SelectedItem 以外は正常に動作します。 ______TextBox1.Text →レコード番号が正常に表示されます。 ______TextBox2.Text →「System.Data.DataRowView」と表示されます。 ______TextBox3.Text →ItemIDが正常に表示されます。 ______TextBox4.Text →ItemIDが正常に表示されます。 ただし、この操作を繰り返した後、画面を閉じると、SelectedItem行とSelectedValue行 に次のようなメッセージが表示されて、エラーが発生します。(なお、ValueMember にも ItemID と設定しても同じ結果です) →「オブジェクト参照がオブジェクト インスタンスに設定されていません。」 【質問1:エラーメッセージの意味について】 Index行は正常に動作しているのに、Item行とValue行になぜエラーが発生するので しょうか?(このプロパティは設定のみで取得できないのでしょうか) 【質問2:エラーメッセージの意味について】 エラーメッセージに記述されている意味がわかりません。何を意味しているのでしょうか。? 【質問2:リストボックスの選択時動作について】 リストボックスで ItemID を選択した時、 OrderDetailsTable のOrderID、ItemID、 数量の表示データが選択 ItemIDに連動して変化し、該当データが表示されます。ListBox1_SelectedIndexChanged イベントに何も指示していないのに、どうして該当 データが表示されるのでしょうか。 | ||||||||||||
|
投稿日時: 2007-09-21 14:47
SelectedItem なり SelectedValue の取得でエラーになることはありません。 問題は後ろの ToString() にあります。 デバッガで確認してみましょう。
例外メッセージにも意味はありますが、それよりも例外クラス名に着目しましょう。 NullReferenceException ですよね。 http://msdn2.microsoft.com/ja-jp/library/sxw2ez55(VS.80).aspx ここに書いてある通りです。 なので、取得した SelectedValue や SelectedItem が Nothing の場合は ToString() でこの例外が発生します。
バインドしている場合は BindingSource の現在アクティブなレコードの情報が表示されます。 リストボックスの選択が変更されることにより、BindingSource のアクティブなレコードが変更されるのです。 | ||||||||||||
|
投稿日時: 2007-09-21 15:03
SelectedIndex プロパティは型を見ればわかるように null がありえないからです。 SelectedItem プロパティ と SelectedValue プロパティは null になることがあり得ます。 値型と参照型の違いの根本ですね。
繰り返しになりそうですが null に対して操作したからです。 今回の場合ですと ToString メソッドという操作をしたことになります。 null に対してこのような操作はできません。 またこういった原因を知りたい場合は例外の詳細を見るように心がけると良いでしょう。
SelectedIndexChanged イベントがどうこうは関係ありません。 非バインドであっても選択されれば変更されます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-09-21 15:20
KIさん、ありがとうございました。正常に動作できました。
このエラーのために3日間もテストを続けて解決できずに気持ちがすさんでいました。本当に感謝しています。 SelectedItem はまだエラーになりますが、SelectedItemが何の意味か理解していません ので、ご指導いただいたNullReferenceExceptionを見ながら自分で調べます。 また、リストボックスの選択が変更されることにより、BindingSource のアクティブ なレコードが変更され、アクティブレコードが表示されていることも理解できました。 おかげさまで、SelectedValueプロパティを取得できることによって、リストボックス にルックアップテーブルの設定も正常に動作できました。 KIさん、本当にいつもありがとうございます。 | ||||||||||||
|
投稿日時: 2007-09-21 15:31
これってリストボックスの表示値の話ではなく、
とあるので、(過去のだんじりさんの質問の経緯からも推察して) データソースウィンドウで形式を「詳細」にして、 フォームにドロップして作った詳細形式の OrderID、ItemID、数量が別にある状態だと思います。 (つまりリストボックスで選択されたOrderの、詳細情報をテキストボックス等に表示するような画面) リストボックスの SelectedIndexChanged で、OrderID、ItemID、数量を表示しているコントロールの 値を書き換えるコードを自前で書かなくても、値が変化するのはなぜか?という質問だと、私は解釈しました。 なので、「バインドしているから」という回答になりました。 | ||||||||||||
|
投稿日時: 2007-09-21 15:37
じゃんぬねっとさん。いつもお世話になります。
null に対してToString メソッドという操作をしていたのですね。再度.ToStringを記述 してエラーを出し、例外の詳細を見ますと KIさんからも指摘されました NullReferenceExceptionが表示されました。勉強します。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2007-09-21 15:59
言われて見れば確かにそうですね。 KI さんに反論するつもりで書いたわけではないですが、汚してしまい申し訳ありません。 他ごとをしながら書いていたので他の部分についても被ってしまいました。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1