- PR -

リストボックスの使い方について

1
投稿者投稿内容
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 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 イベントに何も指示していないのに、どうして該当
データが表示されるのでしょうか。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-09-21 14:47
引用:

Index行は正常に動作しているのに、Item行とValue行になぜエラーが発生するので
しょうか?(このプロパティは設定のみで取得できないのでしょうか)


SelectedItem なり SelectedValue の取得でエラーになることはありません。
問題は後ろの ToString() にあります。
デバッガで確認してみましょう。

引用:

エラーメッセージに記述されている意味がわかりません。何を意味しているのでしょうか。?


例外メッセージにも意味はありますが、それよりも例外クラス名に着目しましょう。
NullReferenceException ですよね。

http://msdn2.microsoft.com/ja-jp/library/sxw2ez55(VS.80).aspx

ここに書いてある通りです。
なので、取得した SelectedValue や SelectedItem が Nothing の場合は
ToString() でこの例外が発生します。

引用:

リストボックスで ItemID を選択した時、 OrderDetailsTable のOrderID、ItemID、
数量の表示データが選択 ItemIDに連動して変化し、該当データが表示されます。ListBox1_SelectedIndexChanged イベントに何も指示していないのに、どうして該当
データが表示されるのでしょうか。


バインドしている場合は BindingSource の現在アクティブなレコードの情報が表示されます。
リストボックスの選択が変更されることにより、BindingSource のアクティブなレコードが変更されるのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-21 15:03
引用:

だんじりさんの書き込み (2007-09-21 14:30) より:

Index行は正常に動作しているのに、Item行とValue行になぜエラーが発生するので
しょうか?(このプロパティは設定のみで取得できないのでしょうか)


SelectedIndex プロパティは型を見ればわかるように null がありえないからです。 SelectedItem プロパティ と SelectedValue プロパティは null になることがあり得ます。 値型と参照型の違いの根本ですね。

引用:

エラーメッセージに記述されている意味がわかりません。何を意味しているのでしょうか。?


繰り返しになりそうですが null に対して操作したからです。 今回の場合ですと ToString メソッドという操作をしたことになります。 null に対してこのような操作はできません。

またこういった原因を知りたい場合は例外の詳細を見るように心がけると良いでしょう。

引用:

リストボックスで ItemID を選択した時、 OrderDetailsTable のOrderID、ItemID、
数量の表示データが選択 ItemIDに連動して変化し、該当データが表示されます。ListBox1_SelectedIndexChanged イベントに何も指示していないのに、どうして該当
データが表示されるのでしょうか。


SelectedIndexChanged イベントがどうこうは関係ありません。 非バインドであっても選択されれば変更されます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-09-21 15:20
KIさん、ありがとうございました。正常に動作できました。

このエラーのために3日間もテストを続けて解決できずに気持ちがすさんでいました。本当に感謝しています。

SelectedItem はまだエラーになりますが、SelectedItemが何の意味か理解していません
ので、ご指導いただいたNullReferenceExceptionを見ながら自分で調べます。

また、リストボックスの選択が変更されることにより、BindingSource のアクティブ
なレコードが変更され、アクティブレコードが表示されていることも理解できました。

おかげさまで、SelectedValueプロパティを取得できることによって、リストボックス
にルックアップテーブルの設定も正常に動作できました。
KIさん、本当にいつもありがとうございます。


KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-09-21 15:31
引用:

じゃんぬねっとさんの書き込み (2007-09-21 15:03) より:
SelectedIndexChanged イベントがどうこうは関係ありません。 非バインドであっても選択されれば変更されます。


これってリストボックスの表示値の話ではなく、

引用:

2.フォームにOrderDetailsTable のOrderID、ItemID、数量の3項目を詳細表示した。



とあるので、(過去のだんじりさんの質問の経緯からも推察して)
データソースウィンドウで形式を「詳細」にして、
フォームにドロップして作った詳細形式の OrderID、ItemID、数量が別にある状態だと思います。
(つまりリストボックスで選択されたOrderの、詳細情報をテキストボックス等に表示するような画面)
リストボックスの SelectedIndexChanged で、OrderID、ItemID、数量を表示しているコントロールの
値を書き換えるコードを自前で書かなくても、値が変化するのはなぜか?という質問だと、私は解釈しました。
なので、「バインドしているから」という回答になりました。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-09-21 15:37
じゃんぬねっとさん。いつもお世話になります。

null に対してToString メソッドという操作をしていたのですね。再度.ToStringを記述
してエラーを出し、例外の詳細を見ますと KIさんからも指摘されました
NullReferenceExceptionが表示されました。勉強します。
ありがとうございました。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-21 15:59
引用:

KIさんの書き込み (2007-09-21 15:31) より:

とあるので、(過去のだんじりさんの質問の経緯からも推察して)データソースウィンドウで形式を「詳細」にして、フォームにドロップして作った詳細形式の OrderID、ItemID、数量が別にある状態だと思います。
(つまりリストボックスで選択されたOrderの、詳細情報をテキストボックス等に表示するような画面)
リストボックスの SelectedIndexChanged で、OrderID、ItemID、数量を表示しているコントロールの
値を書き換えるコードを自前で書かなくても、値が変化するのはなぜか?という質問だと、私は解釈しました。
なので、「バインドしているから」という回答になりました。


言われて見れば確かにそうですね。 KI さんに反論するつもりで書いたわけではないですが、汚してしまい申し訳ありません。 他ごとをしながら書いていたので他の部分についても被ってしまいました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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