C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: データーベースと連結しているListboxの値の取得方法


(過去ログ 37 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■18406 / inTopicNo.1)  データーベースと連結しているListboxの値の取得方法
  
□投稿者/ スライム (1回)-(2008/05/14(Wed) 07:10:41)

分類:[VB.NET/VB2005] 

VB.net2003を使用しています。
Accessデータベースからデータを取得して表示するListbox1があり、ValueMemberをField1、DisplayMemberをField2としています。
このとき、Listboxで選択されているValueMemberの値(1つ)を取得するにはListBox1.SelectedValueで可能なのですが、DisplayMemberの値を取得するのに
Listbox1.SelectedItemでうまくいきません。たとえばForm_Loadイベントで MsgBox(Me.ListBox1.SelectedItem)としてSelectedItemを呼び出すと

「System.ArgumentException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
追加情報 : 引数 'Prompt' を型 'String' に変換することはできません。」

というエラーが表示されてしまいます。(SelectedValueの値は問題なく呼び出し可能です)
データベースと連結している場合は何か別のプロパティを用いる必要があるのでしょうか?

ご教示よろしくお願いいたします。
引用返信 編集キー/
■18409 / inTopicNo.2)  Re[1]: データーベースと連結しているListboxの値の取得方法
□投稿者/ 癒耶 (6回)-(2008/05/14(Wed) 09:34:20)
> 「System.ArgumentException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
> 追加情報 : 引数 'Prompt' を型 'String' に変換することはできません。」
>
> というエラーが表示されてしまいます。(SelectedValueの値は問題なく呼び出し可能です)
> データベースと連結している場合は何か別のプロパティを用いる必要があるのでしょうか?
>
> ご教示よろしくお願いいたします。
System.ArgumentExceptionがどういうエラーなのかは調べましたか?
引数 'Prompt' を型 'String' に変換することはできません。
↑この部分でもわかるかと思いますが
SelectedItemはObject型なので正しい型に変換してあげる必要があります。
MsgBoxにListbox1.SelectedItemをそのまま入れようとするとObject型のままでは表示出来ないので
String型に変換しようとします。
この時Listbox1.SelectedItemの中身が実際にはString型では無かった時、上記のエラーが発生します。
引用返信 編集キー/
■18883 / inTopicNo.3)  Re[2]: データーベースと連結しているListboxの値の取得方法
□投稿者/ スライム (2回)-(2008/05/17(Sat) 07:27:30)
No18409 (癒耶 さん) に返信

お礼が遅くなりまして申し訳ありません。
当方の不勉強でした。エラーの内容はよく理解できました。
Object型のSelectedItemをどのようにしてString型に変換するか色々悩んだのですが(Cstrなどで一発変換はできませんでした)
なんとか以下の方法でエラーが解消されました。(もっとスマートな方法があればご教示いただければ幸いです)
どうもありがとうございました。

MsgBox(CType(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1), String))


> SelectedItemはObject型なので正しい型に変換してあげる必要があります。
> MsgBoxにListbox1.SelectedItemをそのまま入れようとするとObject型のままでは表示出来ないので
> String型に変換しようとします。
> この時Listbox1.SelectedItemの中身が実際にはString型では無かった時、上記のエラーが発生します。
解決済み
引用返信 編集キー/
■18884 / inTopicNo.4)  Re[3]: データーベースと連結しているListboxの値の取得方法
□投稿者/ ぽぴ王子 (374回)-(2008/05/17(Sat) 07:37:28)
ぽぴ王子 さんの Web サイト
No18883 (スライム さん) に返信
> ■No18409 (癒耶 さん) に返信
>
> お礼が遅くなりまして申し訳ありません。
> 当方の不勉強でした。エラーの内容はよく理解できました。
> Object型のSelectedItemをどのようにしてString型に変換するか色々悩んだのですが(Cstrなどで一発変換はできませんでした)
> なんとか以下の方法でエラーが解消されました。(もっとスマートな方法があればご教示いただければ幸いです)
> どうもありがとうございました。
>
> MsgBox(CType(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1), String))
>
>
>>SelectedItemはObject型なので正しい型に変換してあげる必要があります。
>>MsgBoxにListbox1.SelectedItemをそのまま入れようとするとObject型のままでは表示出来ないので
>>String型に変換しようとします。
>>この時Listbox1.SelectedItemの中身が実際にはString型では無かった時、上記のエラーが発生します。

元のソースが開示されていないのでなにをどーすればいいかはさっぱりわかりませんが。

> MsgBox(CType(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1), String))

これは

> MsgBox(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1).ToString())

でいけませんか?

…というか、ListBox1.SelectedItem が DataRowView になっていて、そこから Item(1) を取り出すのは
何かが違うような気がします。
データ設定のところのコードを出してもらえれば何かあるのでしょうけど、現段階ではなんとも言えません。
引用返信 編集キー/
■18925 / inTopicNo.5)  Re[4]: データーベースと連結しているListboxの値の取得方法
□投稿者/ スライム (3回)-(2008/05/18(Sun) 11:20:07)
2008/05/18(Sun) 11:23:37 編集(投稿者)

No18884 (ぽぴ王子 さん) に返信

お世話になります。

> 元のソースが開示されていないのでなにをどーすればいいかはさっぱりわかりませんが。

後ほどソースを記載しますがまずは概要を説明させていただきますと、

@Accessでテーブル(T1)を作成(フィールドは数値型(F1)とテキスト型(F2)の2つ)
AVB.net2003でリストボックスを作成
BAで作成したリストボックスと@のテーブルを連結
CリストボックスのValueMemberプロパティにF1をDisplayMemberプロパティにF2を設定

という状況下において、プログラムを実行するとリストボックスには当然DisplayMemberに指定した
F2の内容が表示されます。そこで選択中のアイテムの値をとりあえずmsgboxで表示させたいのですがListbox.SelectedValueは正しく取得できるのに
対し、Listbox.SelectedItemのほうは前述したようなエラーになってしまったというわけです。
調べてみると、SelectedItemのデータ型がDataRowView型として認識していたため、String型に変換する際にエラーになってしまうことに気がつきました。
そこでDataRowView型のSelectedItemを無理やりString型に変換しようと思い、Cstr(Listbox.SelectedItem)としてみましたがうまくいかなかったため
MsgBox(CType(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1), String))として値を取得したわけです。
しかし、同じAccessのデータなのにSelectedValueだけ問題なく取得できるのがどうにも納得できず、何か根本的なところが理解できていない可能性があったため
再度質問させていただきました。

>
> …というか、ListBox1.SelectedItem が DataRowView になっていて、そこから Item(1) を取り出すのは
> 何かが違うような気がします。

私も何かが違うような気はするのですが・・・その「何か」が分かりません。

<ソース>


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.OleDbDataAdapter1.Fill(DsTest1.T1)
MsgBox(Me.ListBox1.SelectedValue)
MsgBox(Me.ListBox1.SelectedItem) '←ここで失敗
MsgBox(CType(Me.ListBox1.SelectedItem, DataRowView).Item(1).ToString()) '←これならうまくいく
End Sub


※ご参考までに・・・
リストボックスのDataSourceプロパティ:DsTest1.T1
リストボックスのDisplayMember:F2
リストボックスのValueMember:F1
OleDbDataAdapterのSelectコマンド:SELECT F1, F2 FROM T1
おそらくデータベースとの連結自体に問題はないと思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -