お世話になります。開発環境ですが、XPでVB.NET2005を使っています。
コンボボックスの選択した値をテーブルに登録するとその値が登録されず、System.Data.DataRowViewというものが入っています。頻繁に起こるわけでなくちゃんと値が登録できるときもあり、原因がわかりません。原因等ご存知の方いませんか?ご教授お願い致します。
> コンボボックスの選択した値を
ComboBox へは、どのようにして値をセットしていますか?
また、選択された値はどのようなコードで得ていますか?
> テーブルに登録すると
ここでいうテーブルとは何ですか?
DataTable の事でしょうか。それともデータベース上の表でしょうか?
また、登録するというのは、どのようにして行っているのでしょうか?
> System.Data.DataRowViewというものが入っています。
DataView や DataTable 等へのデータバインドを行った場合、
(DataRow ではなく)DataRowView が返されることになりますね。
> 原因がわかりません。原因等ご存知の方いませんか?
その前に、町田奈津子さんがどのようなコードを書いているのかさえ
示されていないのですから、残念ながらよほど勘の良い人で無い限り、
明確な答えを出す事はできないと思いますよ…。
魔界の仮面弁士さんご回答ありがとうございます。
データテーブルに登録します。
選択された値は登録する際に関数を呼び出して値を取得し、登録を行うというもので引数にコントロールを渡します。
その関数が下記です。
Dim data As String = ""
Dim Type As String
Type = ctl.GetType.Name
'タイプによって登録方法をかえる
Select Case Type
Case "TextBox"
Dim txt As TextBox = CType(ctl, TextBox)
data = txt.Text
Case "ComboBox"
Dim cmb As ComboBox = CType(ctl, ComboBox)
data = cmb.Text
End Select
Return data
このReturnで返ってきたときにSystem.Data.DataRowViewになるときもあり、ならないときもあります。
> 選択された値は登録する際に関数を呼び出して値を取得し
それは、先の私の逆質問に対する
>>> テーブルに登録すると
>> ここでいうテーブルとは何ですか?
への回答ですよね。その情報も重要ですが、それだけではなく
>> ComboBox へは、どのようにして値をセットしていますか?
>> また、選択された値はどのようなコードで得ていますか?
の部分への回答は頂けないのでしょうか?
そうした情報が無ければ、「ComboBox からの取得方法が間違っている」のか、
「ComboBox へのデータ設定方法が間違っている」のか、あるいは
「DataTable への登録手順に問題がある」のか、「.NET 側のバグ等」なのか
「どちらも問題が無いが、デバッグ手順に混乱がある」のか判断できません。
単純に "System.Data.DataRowView" が返されるパターンと言えば、
Dim table As New DataTable()
table.Columns.Add("F1")
table.Columns.Add("F2")
table.Rows.Add("123", "あいうえお")
table.Rows.Add("456", "かきくけこ")
table.Rows.Add("789", "さしすせそ")
ComboBox1.DataSource = table.Copy()
ComboBox1.ValueMember = "F1"
ComboBox1.DisplayMember = "F2"
ComboBox2.DataSource = table.Copy()
ComboBox2.ValueMember = Nothing
ComboBox2.DisplayMember = Nothing
のようなケースが考えられますが、そちらの環境が分からない以上、
これ以上の回答は控えさせてもらいます。
> 'タイプによって登録方法をかえる
であるならば、[型名]ではなく、
Dim txt As TextBox = TryCast(ctl, TextBox)
If txt IsNot Nothing Then
であるとか、
If TypeOf ctl Is TextBox Then
のように、[型]そのもので比較すべきかと思いますよ。
> data = txt.Text
中略
> data = cmb.Text
中略
> Return data
であるならば、「Return DirectCast(ctl, Control).Text」の一行で良いかと。
# もし、ctrl が Control 型であるならば、キャストすら不要。