- PR -

DataGridViewComboBoxColumnへの空白選択肢設定

1
投稿者投稿内容
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2007-08-03 19:49
VB2005でWindows Applicationを作成しています。

DataGridViewのDataGridViewComboBoxColumnにて空白の選択肢を設定できず困っています。

問題のComboBox列を仮にDGVComboと呼びます。

DGVComboのItemには、以下のクラスインスタンスをListに集めて設定しています。
Class ListItem
Property ValueMenber As Object
Property DisplayMember As String
※細かい中身は省略します
End Class

DGVComboのフィールドが必須ではないため、空白の選択肢を含めて以下のように設定しています。

ValueMemverをNothing
DisplayMemberを""
のListItemインスタンスを作成し、その後いくつかのListItemと共にList(of ListItem)に格納して

DataSource=ListItems
ValueMember="ValueMember"
DisplayMember="DisplayMember"

として選択肢を設定しました。

さらに、DataGridViewにバインドするDataTableを作成

Dim dtblTest As New DataTable
With dtblTest
.Columns.Add(New DataColumn("testID", GetType(Integer)))
.Columns.Add(New DataColumn("name", GetType(String)))
End With

DataGridViewのDataSourceにdtblTestを指定し、testIDフィールドをDGVComboのDataPropertyNameにセットしました。

これを実行すると、testIDの値によって正しくDGVComboが選択されています。

ところが、この選択肢を空白の選択肢に切り替えて、隣のセルや他のコントロールに移動しようとすると以下のメッセージが表示され、前に選択されていた値に戻ってしまいます。

------------------------------------------------
DataGridViewで次の例外が発生しました。

System.ArgumentException: 列'testID'をNullに設定できません。DBNullを使用してください。
 場所 System.Data.DataRow.set_Item(DataColun column, Object value)

この規定のダイアログを置き換えるには、DataErrorイベントをハンドルしてください。
-------------------------------------------------

空白行用のListItemのValueMemberをDBNull.Valueにしても結果は変わりませんでした。
空白以外の値を選択することは可能です。
testIDの値がもともとNullの場合、表示時には空白行が選択されていますが、これを改めて空白行を選ぶと同様のエラーが発生します。

また、普通のComboBoxの場合は、この方法でうまくいきます。


どなたか解決法をご教示いただけないでしょうか。

よろしくお願いいたします。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-08-07 09:10
DataGridViewStyle.NullValue は規定で String.Empty ですから、
「ListItemのValueMember」 を String.Empty にしてはどうでしょうか?
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2007-08-07 16:26
引用:

KIさんの書き込み (2007-08-07 09:10) より:
DataGridViewStyle.NullValue は規定で String.Empty ですから、
「ListItemのValueMember」 を String.Empty にしてはどうでしょうか?



ListItemのValueMemberをString.Emptyに設定してみましたが、結果はエラーになりました。
また、
Value = DBNull.Value
Display = String.Empty
に設定しても同じくエラーとなりました。

根本的な理由はわからないのですが、以下の設定で動作させることができましたのでご報告します。

Value = DBNull.Value
Display = " " ←半角ブランク

対処療法的な感じは拭えませんが、とりあえず上記の方法で対処しようと思います。

アドバイスをいただき、ありがとうございました。
1

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