- ベストアンサー
DataGridViewの列にコンボボックスを表示する方法
- DataGridViewの列にコンボボックスを表示する方法について
- DataGridViewComboBoxColumnを使用する方法ではうまく表示できましたが、DataSourceプロパティを使用する方法ではうまくできません。
- 所属名称の後に列名が空白のコンボボックスが新たに追加作成されてしまいます。System.FormatException: DataGridViewComboBoxCell の値が有効ではありません
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、問題は2つありました。 一つが、 >所属名称の後に列名が空白のコンボボックスが新たに追加作成されてしまいます。 これは解決したとの事ですね。 もう一つ、 >System.FormatException: DataGridViewComboBoxCell の値が有効ではありません >この既定のダイアログを置き換えるには、DataError イベントをハンドルしてください。 >とエラーが出ます。 この問題は、 前回もいいましたが、 また上のエラーは、DataGridView のコンボボックス列のアイテム内容以外の値が DataGridViewの該当列にあるとその様なエラーがでます。 要するに、該当カラムのデータの値とコンボボックスの内容と整合性がとれていない言なのです。 恐らく、この様な事だと想像します。 ID 所属コード 所属名称 1 1 小学校 上の内容が、DataGridViewの中味のデータだとすると、 「小学校」の表示する値がコンボボックスにないとの事です。 コンボボックスは、値がオブジェクトになっています。 このオブジェクトは、値が1の時、「小学校」に変換されて表示されます。 と言う事は、所属名称の値が「小学校」だと、コンボボックスはどう表示して いいか悩むでしょう。 所属名称の値 1 -->小学校 所属名称の値 2 -->中学校 所属名称の値 3 -->高校 所属名称の値 小学校-->??? にならないですか?。 正しいテーブル内容は、想像だが、 ID 所属コード 所属名称 1 1 1 になっていれば、 所属名称の値 1 -->小学校 にコンボボックスが自動的に変換して表示するのでは。 だから、 strsql = "SELECT ID, 所属コード, 所属コード as 所属名称 FROM ATBL LEFT OUTER JOIN BTBL ON ATBL.所属 = BTBL.コード ORDER BY ID" にしたらどうです?。 VB2005は、もっていないので、検証できないので、そちらで検証して下さい。
その他の回答 (1)
- kunkun_129
- ベストアンサー率64% (16/25)
下の様にしたらどうです。 Dim DataSource As New DataTable("DataSource") DataSource.Columns.Add("Value", GetType(String)) DataSource.Columns.Add("code", GetType(Integer)) DataSource.Rows.Add("", 0) DataSource.Rows.Add("小学校", 1) DataSource.Rows.Add("中学校", 2) DataSource.Rows.Add("高校", 3) Dim column As New DataGridViewComboBoxColumn() column.DataPropertyName = "所属名称" column.DataSource = DataSource column.ValueMember = "code" column.DisplayMember = "Value" dgrview.Columns.Insert(cDataGrid.Columns("所属名称").Index, column) ここを変更 dgrview.Columns.Remove("所属名称") ここを変更 >System.FormatException: DataGridViewComboBoxCell の値が有効ではありません >この既定のダイアログを置き換えるには、DataError イベントをハンドルしてください。 >いったい何がおかしいのか???です。よろしくお願いします。 また上のエラーは、DataGridView のコンボボックス列のアイテム内容以外の値が DataGridViewの該当列にあるとその様なエラーがでます。 例えば、コンボボックスに、「小学校」、「中学校」、「高校」の値があるが、 その該当列のDataGridView カラムの値に 「大学」の値が入っていれば、 「大学」の値がコンボボックスにないから、その様なエラーになります。
お礼
すみません。補足回答は無視してください。 DataGridViewに表示するデータがない場合は下記のコーディングでコンボボックスを表示することができました。 しかし、データを1件でも準備すると、 System.FormatException: DataGridViewComboBoxCell の値が有効ではありません この既定のダイアログを置き換えるには、DataError イベントをハンドルしてください。 とエラーが出ます。 データもリスト外のデータではないので問題ないと思うのですが… <データ> ID 所属コード 所属名称 1 1 小学校 '---------------------------------------------------------------------- 'DataGridViewにComboBoxを設定する(DataSourceプロパティを使用した例) '---------------------------------------------------------------------- Dim DataSource As New DataTable("DataSource") DataSource.Columns.Add("Value", GetType(String)) DataSource.Columns.Add("code", GetType(Integer)) DataSource.Rows.Add("", 0) DataSource.Rows.Add("小学校", 1) DataSource.Rows.Add("中学校", 2) DataSource.Rows.Add("高校", 3) Dim column As New DataGridViewComboBoxColumn() column.DataPropertyName = "所属名称" column.DataSource = DataSource column.ValueMember = "code" column.DisplayMember = "Value" dgrview.Columns.Insert(dgrview.Columns("所属名称").Index, column) dgrview.Columns.Remove("所属名称") column.Name = "所属名称"
補足
お返事おそくなりました。PCの調子が悪くしばらく検証ができませんでした。 下記の通りでいいんですよね? <データ> ID 所属コード 所属名称 1 1 小学校 2 2 中学校 とあった場合、下記のコーディングでデータは表示されますが、所属名称の部分がコンボボックスになりません。 他におかしいところありますか? Dim DataSource As New DataTable("DataSource") DataSource.Columns.Add("Value", GetType(String)) DataSource.Columns.Add("code", GetType(Integer)) DataSource.Rows.Add("", 0) DataSource.Rows.Add("小学校", 1) DataSource.Rows.Add("中学校", 2) DataSource.Rows.Add("高校", 3) Dim column As New DataGridViewComboBoxColumn() column.DataPropertyName = "所属名称" column.DataSource = DataSource column.ValueMember = "code" column.DisplayMember = "Value" column.Name = "所属名称" dgrview.Columns.Insert(dgrview.Columns("所属名称").Index, column) dgrview.Columns.Remove("所属名称")
お礼
どうもありがとうございました。無事解決できました。 kunkun_129さんのおかげでエラーの意味も理解できました。 結果として書かせていただきます。 所属コードは質問で書いてなかったのですが、数値型ではなくvarcharだったのでIntegerをStringに変更にすることで解決できました。 Dim DataSource As New DataTable("DataSource") DataSource.Columns.Add("Value", GetType(String)) DataSource.Columns.Add("code", GetType(String)) ←ここを変更 DataSource.Rows.Add("", "0") ←ここを変更 DataSource.Rows.Add("小学校", "1") ←ここを変更 DataSource.Rows.Add("中学校", "2") ←ここを変更 DataSource.Rows.Add("高校", "3") ←ここを変更 Dim column As New DataGridViewComboBoxColumn() column.DataPropertyName = "所属コード" ←ここを変更 column.DataSource = DataSource column.ValueMember = "code" column.DisplayMember = "Value" dgrview.Columns.Insert(dgrview.Columns("所属名称").Index, column) dgrview.Columns.Remove("所属名称") column.Name = "所属名称"