VB.NET2003のDataGridでコンボボックス

このQ&Aのポイント
  • VB.NET2003のDataGridでコンボボックスを作成する方法と選択した値の取得方法について調査中です。
  • DataGridに異なる値のコンボボックスを行ごとに作成することも可能か確認中です。
  • VB.NET2003のDataGridでコンボボックスを作成する方法について知りたいです。また、選択した値を取得する方法や行ごとに異なる値のコンボボックスを作成する方法についても教えてください。
回答を見る
  • ベストアンサー

VB.NET2003のDataGridでコンボボックス

こんにちは。 最近VB.NET(2003)を始めたばかりの初心者です。 DataGridにコンボボックスを作成する方法を探してまして、 http://dobon.net/vb/dotnet/datagrid/datagridcombobox.html に書いてあるようにDataGridTextBoxColumnクラスからの派生クラスを作成して呼び出してみました。 そうしたところ、コンボボックスが表示され、データのセットもきちんとできました。 しかし、そのコンボボックスで選択している値を取得する方法がわからなく困ってます。 たとえば Dim comboSorce As New DataTable("ComboBox") comboSorce.Columns.Add("DisplayMember", GetType(String)) comboSorce.Columns.Add("ValueMember", GetType(Integer)) comboSorce.Rows.Add(New Object() {"OK", 0}) comboSorce.Rows.Add(New Object() {"NG", 1}) というデータをコンボボックスにセットした場合 OK,NGという表示上の値は CStr(DataGrid1(row,col)) で取得できますが、実際の値を取得する方法がわかりません。 ご存知の方いらっしゃいましたら、ご教授ください。 それと、行毎に違う値(リストデータ)のコンボボックスを作成することはできますでしょうか? 以上です。よろしくお願いします。

noname#23059
noname#23059

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>行ごとに違うリストのコンボボックスを表示させたいのです それもDOBONさんのクラスを改造したら可能です。 あまり難しく考えず、コードをよく見てみましょうね^^; この手のオブジェクト継承は、難しく捉われがちですが、 DOBONさんのサンプルは非常によくまとまっているし、 デバッグしたら、それほぞ難しいことはしておりません。 コメントも付いてるし。。。。 改造は[DataGridComboBoxColumn]クラス部だけでよいです。 [DataGridComboBox]はそのままです。 -------------------------------------------------------------------------------- Public Class DataGridComboBoxColumn   Inherits DataGridTextBoxColumn   Private _comboBox() As DataGridComboBox   Private _sorce As CurrencyManager   Private _rowNumber As Integer   Private _editing As Boolean   '/ <summary>   '/ DataGridComboBoxColumnのコンストラクタ   '/ </summary>   '/ <param name="dataSource">ComboBoxのDataSource</param>   '/ <param name="displayMember">ComboBoxのDisplayMember</param>   '/ <param name="valueMember">ComboBoxのValueMember</param>   Public Sub New( _       ByVal dataSource() As DataView, _       ByVal displayMember As String, _       ByVal valueMember As String)     '初期設定     _sorce = Nothing     _editing = False     ReDim _comboBox(dataSource.Length - 1)     Dim l_combo As DataGridComboBox     Dim i As Integer     For i = 0 To _comboBox.Length - 1       Call myNew(_comboBox(i), dataSource(i), displayMember, valueMember)     Next   End Sub   'プロパティ   '/ <summary>   '/ 管理されている ComboBox コントロールを取得します。   '/ </summary>   Public ReadOnly Property ComboBox() As DataGridComboBox     Get       Return GetActiveCombobox(_rowNumber)     End Get   End Property   'ComboBoxからフォーカスが離れた   Private Sub _comboBox_Leave(ByVal sender As Object, _       ByVal e As EventArgs)     If _editing Then       'ComboBoxが編集中だったとき       _editing = False       '行の値を更新する       SetColumnValueAtRow(_sorce, _rowNumber, _         GetActiveCombobox(_rowNumber).Text)       Invalidate()     End If     'ComboBoxを隠す     GetActiveCombobox(_rowNumber).Visible = False     'DataGridのスクロールイベントを捕捉する     AddHandler DataGridTableStyle.DataGrid.Scroll, _       AddressOf DataGrid_Scroll   End Sub   'DataGridがスクロール   Private Sub DataGrid_Scroll(ByVal sender As Object, _       ByVal e As EventArgs)     'ComboBoxを消す     If GetActiveCombobox(_rowNumber).Visible Then       GetActiveCombobox(_rowNumber).Visible = False     End If   End Sub   'ComboBoxで選択した項目が変更されて、その変更がコミットされた   Private Sub _comboBox_SelectionChangeCommitted( _       ByVal sender As Object, ByVal e As EventArgs)     _editing = True     'DataGridに列が編集開始されたことを知らせる     MyBase.ColumnStartedEditing(CType(sender, Control))   End Sub   '行の最小の高さ   Protected Overrides Function GetMinimumHeight() As Integer     Return GetActiveCombobox(_rowNumber).PreferredHeight   End Function   'ComboBoxをDataGridのControl.ControlCollectionに追加する   Protected Overrides Sub SetDataGridInColumn( _       ByVal value As DataGrid)     MyBase.SetDataGridInColumn(value)     Dim l_combo As DataGridComboBox     For Each l_combo In _comboBox       l_combo.Parent = CType(value, Control)     Next   End Sub   '列が管理しているコントロールへのフォーカスを   '放棄する必要があることを列に通知   Protected Overrides Sub ConcedeFocus()     MyBase.ConcedeFocus()     GetActiveCombobox(_rowNumber).Visible = False   End Sub   ''編集するためにセルを準備する   Protected Overloads Overrides Sub Edit( _       ByVal source As CurrencyManager, _       ByVal rowNum As Integer, _       ByVal bounds As Rectangle, _       ByVal [readOnly] As Boolean, _       ByVal instantText As String, _       ByVal cellIsVisible As Boolean)     '基本クラスのEditを呼び出す     MyBase.Edit(source, rowNum, bounds, [readOnly], _       instantText, cellIsVisible)     'TextBoxを消す     Me.TextBox.Visible = False     '値の保存     _rowNumber = rowNum     _sorce = source     '表示させるComboBoxの設定をする     GetActiveCombobox(rowNum).Bounds = bounds     GetActiveCombobox(rowNum).RightToLeft = _       Me.DataGridTableStyle.DataGrid.RightToLeft     '非表示、読み取り専用のときは、ComboBoxを表示しない     If cellIsVisible AndAlso Not [readOnly] Then       'ComboBoxを表示       GetActiveCombobox(rowNum).Visible = True       GetActiveCombobox(rowNum).BringToFront()       GetActiveCombobox(rowNum).Focus()     End If     '選択項目の変更     'ComboBoxを表示する前に行うと、     '新しい行で値を変更した時不都合が起きる     GetActiveCombobox(rowNum).SelectedIndex = _       GetActiveCombobox(rowNum).FindStringExact(Me.TextBox.Text)     'DataGridのスクロールイベントを捕捉する     AddHandler DataGridTableStyle.DataGrid.Scroll, _       AddressOf DataGrid_Scroll   End Sub   '編集プロシージャを完了する   Protected Overrides Function Commit( _       ByVal dataSource As CurrencyManager, _       ByVal rowNum As Integer) As Boolean     If _editing Then       '編集中のときは、rowNum行の値を設定する       _editing = False       SetColumnValueAtRow(dataSource, rowNum, _         GetActiveCombobox(rowNum).Text)     End If     Return True   End Function   '指定した行の値を設定   Protected Overrides Sub SetColumnValueAtRow( _       ByVal source As CurrencyManager, _       ByVal rowNum As Integer, ByVal value As Object)     'ValueMemberの値を設定する     MyBase.SetColumnValueAtRow(source, rowNum, _       GetActiveCombobox(rowNum).FindValueMember(value))   End Sub   '指定した行の値を取得   Protected Overrides Function GetColumnValueAtRow( _       ByVal source As CurrencyManager, _       ByVal rowNum As Integer) As Object     Dim val As Object = _       MyBase.GetColumnValueAtRow(source, rowNum)     'DisplayMemberの値を返す     Return GetActiveCombobox(rowNum).FindDisplayMember(val)   End Function   'NEW用の関数   Private Sub myNew( _         ByRef _combo As DataGridComboBox, _         ByVal dataSource As DataView, _         ByVal displayMember As String, _         ByVal valueMember As String)     'DataGridComboBoxの作成     _combo = New DataGridComboBox()     'ComboBoxの設定     _combo.DropDownStyle = ComboBoxStyle.DropDownList     _combo.Visible = False     'データソースの設定     _combo.DataSource = dataSource     _combo.DisplayMember = displayMember     _combo.ValueMember = valueMember     'イベントハンドラ     AddHandler _combo.Leave, AddressOf _comboBox_Leave     AddHandler _combo.SelectionChangeCommitted, _       AddressOf _comboBox_SelectionChangeCommitted   End Sub   '配列要素からN(ROW)番を考慮し、データグリッドコンボボックスを返却する   Private Function GetActiveCombobox(ByVal rowNum As Integer) As DataGridComboBox     Dim l_index As Integer = (rowNum Mod _comboBox.Length)     Return _comboBox(l_index)   End Function End Class -------------------------------------------------------------------------------- 画面側は、DATAVIEWを配列で渡します。 下のサンプルは配列要素2ですが、いくつでも良いです。 -------------------------------------------------------------------------------- Dim dt As New DataTable("DataTable1") dt.Columns.Add("Column1", GetType(Integer)) dt.Rows.Add(New Object() {5}) dt.Rows.Add(New Object() {9}) dt.Rows.Add(New Object() {3}) dt.Rows.Add(New Object() {1}) dt.Rows.Add(New Object() {4}) dt.Rows.Add(New Object() {3}) dt.Rows.Add(New Object() {7}) dt.Rows.Add(New Object() {6}) dt.Rows.Add(New Object() {10}) 'DataGridで表示するデータソースに設定 DataGrid1.DataSource = dt 'DataGridTableStyleの作成 Dim ts As New DataGridTableStyle() ts.MappingName = "DataTable1" 'DataGridComboBoxColumnで使用するDataTableの作成 '"DisplayMember"列はComboBoxに表示される値 '"ValueMember"列は実際の値 Dim comboSorce1 As New DataTable("ComboBox") With comboSorce1   .Columns.Add("DisplayMember", GetType(String))   .Columns.Add("ValueMember", GetType(Integer))   .Rows.Add(New Object() {"一", 1})   .Rows.Add(New Object() {"二", 2})   .Rows.Add(New Object() {"三", 3})   .Rows.Add(New Object() {"四", 4})   .Rows.Add(New Object() {"五", 5})   .Rows.Add(New Object() {"六", 6})   .Rows.Add(New Object() {"七", 7})   .Rows.Add(New Object() {"八", 8})   .Rows.Add(New Object() {"九", 9})   .Rows.Add(New Object() {"十", 10}) End With Dim comboSorce2 As DataTable = comboSorce1.Clone With comboSorce2   .Rows.Add(New Object() {"(1)", 1})   .Rows.Add(New Object() {"(2)", 2})   .Rows.Add(New Object() {"(3)", 3})   .Rows.Add(New Object() {"(4)", 4})   .Rows.Add(New Object() {"(5)", 5})   .Rows.Add(New Object() {"(6)", 6})   .Rows.Add(New Object() {"(7)", 7})   .Rows.Add(New Object() {"(8)", 8})   .Rows.Add(New Object() {"(9)", 9})   .Rows.Add(New Object() {"(10)", 10}) End With Dim l_dvw() As DataView = New DataView() {comboSorce1.DefaultView, comboSorce2.DefaultView} 'DataGridComboBoxColumnの作成 Dim cbc As New Dobon.Samples.Forms.DataGridComboBoxColumn( _   l_dvw, "DisplayMember", "ValueMember") cbc.MappingName = "Column1" cbc.HeaderText = "数字" '列スタイルの追加 ts.GridColumnStyles.Add(cbc) 'テーブルスタイルの追加 DataGrid1.TableStyles.Add(ts) -------------------------------------------------------------------------------- コンボボックスの切り替えは、 DataGridComboBoxColumn.GetActiveCombobox にて行っております。 法則を変更したければ、そちらを改造してください。

noname#23059
質問者

お礼

ありがとうございました! できました!! 本当にお世話になりました。 >あまり難しく考えず、コードをよく見てみましょうね^^; そうですね^^; 反省・・・。 じっくりコードを見直して勉強します!

その他の回答 (1)

回答No.1

>CStr(DataGrid1(row,col)) これは画面を見ているだけなので、グリッドのデータソースへの反映値を読んだらいいです。 ついでなので、値からDOBONさんのクラスを利用した変換方法も書いておきます。 Dim l_tbl As DataTable = DirectCast(DataGrid1.DataSource, DataTable) Dim i, j As Integer Dim l_str画面 As String Dim l_str値_GridTable As String Dim l_str値_画面より算出 As String Dim ts As DataGridTableStyle Dim cbc As Dobon.Samples.Forms.DataGridComboBoxColumn Dim cb As Dobon.Samples.Forms.DataGridComboBox Dim l_strテーブル名 As String = l_tbl.TableName Dim l_strカラム名 As String If Me.DataGrid1.TableStyles.Contains(l_strテーブル名) Then   ts = Me.DataGrid1.TableStyles(l_strテーブル名) Else   MsgBox("スタイル設定なし")   Return End If For i = 0 To l_tbl.Columns.Count - 1   l_strカラム名 = l_tbl.Columns(i).ColumnName   If ts.GridColumnStyles.Contains(l_strカラム名) Then     cbc = ts.GridColumnStyles(l_strカラム名)     cb = cbc.ComboBox   Else     l_str値_画面より算出 = "《設定されていません》"     cb = Nothing   End If   For j = 0 To l_tbl.Rows.Count - 1     '画面上の値     l_str画面 = DataGrid1.Item(j, i)     'Gridのテーブルの反映値     l_str値_GridTable = l_tbl.Rows(j).Item(i).ToString     If Not (cb Is Nothing) Then       '値からクラスを利用して、求めた値       l_str値_画面より算出 = cb.FindValueMember(l_str画面)     End If     Console.WriteLine( _       "ROW={0}:COL{1}:表示は{2}:Gridの値は{3}:表示から変換した値は{4}" _       , j, i _       , l_str画面 _       , l_str値_GridTable _       , l_str値_画面より算出 _     )   Next Next それと、 >毎に違う値(リストデータ)のコンボボックスを作成 できます。 グリッドに2列目を作成。さらにその2列目用のスタイルを作成しマッピングしてあげたらよいです。

noname#23059
質問者

お礼

わざわざコードまでご丁寧にありがとうございます! おかげさまで値の取得ができました! >>毎に違う値(リストデータ)のコンボボックスを作成 >できます。 >グリッドに2列目を作成。さらにその2列目用のスタイルを>作成しマッピングしてあげたらよいです。 えっと、すみません。 行ごとに違うリストのコンボボックスを表示させたいのです。 別の列に違うコンボボックスを表示するのはできてるのですが、1つの列内の違う行に表示させることはできますでしょうか?

関連するQ&A

  • コンボボックスに固定値をセットして表示する方法

    お世話になります。さっそくですが、質問です。 現在、VB.NET 2008で開発を行ってます。 質問の目的は、 実行プログラムにおいて、 画面に配置したコンボボックスをクリックした際、 以下の値を選択肢として表示させることです。 (【性別】の選択肢) ・男性 ・女性 Form_Load()時に、コンボボックスに上記の値を固定でセットしています。 ------------------------------------------------- Public Function getDataField1() As DataSet '変数宣言 Dim ds As DataSet Dim dt As New DataTable Dim dr As DataRow dt.Columns.Add("DataTextField", GetType(String)) dt.Columns.Add("DataValueField", GetType(String)) '空白セット dr = dt.NewRow() dr("DataTextField") = "      " dr("DataValueField") = ",,,," dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "1" dr("DataValueField") = "男性" dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "2" dr("DataValueField") = "女性" dt.Rows.Add(dr) ds = New DataSet ds.Tables.Add(dt) Return ds End Function Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ds As DataSet '性別の取得 ds = getDataField1() For i As Integer = 0 To 2 cmb_性別.Items.Add() ds.Tables(0).Rows(i).Item("DataValueField").ToString() Next i End Sub ------------------------------------------------- 上記内容の場合、コンボボックスをクリックしても 選択肢としては"空白"しか表示されません。 セットした値をコンボボックスの選択肢として表示させる方法を ご存知の方がいらっしゃいましたら、ご教授願えますでしょうか?

  • DataGridViewの列にコンボボックスを表示する方法

    言語:VB2005 データベース:SQLServer 非接続型のデータアクセスです。 .net勉強中の初心者です。件名の件について悩んでいますのでご教授お願いします。 http://dobon.net/vb/dotnet/datagridview/datagridviewcomboboxcolumn.html 上記HPを参考に勉強しています。 DataGridViewComboBoxColumnを使用する方法ではうまく表示できましたが、 DataSourceプロパティを使用する方法ではうまくできません。 (1)の処理を行うとまず、ID 所属コード 所属名称 がDataGridViewにバインドされます。 そこに(2)の処理を行い 所属名称を コンボボックスに変更したいのですが、所属名称の後に 列名が空白のコンボボックスが新たに追加作成されてしまいます。 そして下記のエラーが発生します。 System.FormatException: DataGridViewComboBoxCell の値が有効ではありません この既定のダイアログを置き換えるには、DataError イベントをハンドルしてください。 いったい何がおかしいのか???です。よろしくお願いします。 '**************************************** '(1)DataGridViewにデータをバインドする '**************************************** strsql = "SELECT ID, 所属コード, t1.名称 as 所属名称 FROM ATBL LEFT OUTER JOIN BTBL ON ATBL.所属 = BTBL.コード ORDER BY ID" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "テーブル") dgrview.DataSource = ds dgrview.DataMember = "テーブル" '---------------------------------------------------------------------- '(2)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.Add(column)

  • コンボボックスのマウスホイールを無効にしたい

    DataGridView内にコンボボックスを設定しております。 マウスのホイールボタンは、DataGridViewの縦スクロールに 使いたいのですが、DataGridView内のコンボボックスに カーソルがある場合、コンボボックス内のデータが変わってしまいます。 ユーザー側と打ち合わせた結果、コンボボックスにカーソルが ある時に、マウスのホイールボタンを無効に出来ないかと 言われております。 色々調べてみましたが、私では分からず、教えて下さい。 (サンプルソース) Dim column1 As New DataGridViewComboBoxColumn() With DataGridView1 .Columns.Clear() .Columns.Add("Col01", "列1") With column1 .Items.AddRange(New String() {"Item01", "Item02", "Item03"}) .Name = "Col02" .HeaderText = "列2" End With .Columns.Add(column1) For i As Integer = 0 To 100 .Rows.Add() Next i End With

  • VBでコンボボックスとテキストボックスの連係

    VBでフォームにデータコンボボックスとテキストボックスを一つづつ作り、データコンボボックスで値を選択し、その値に対する値をテキストボックスに表示させたいんですがどうすればいいでしょうか? データコンボボックスで選択する元になるテーブルは ID | 商品 1 | みかん 2 | ばなな 3 | りんご と、上記のような形のテーブルをもちいています。 例えばデータコンボボックスで「1」を選択した場合テキストボックスに「みかん」と表示させたいです。

  • VB6 DBと連結しないDataGrid

    VB6の標準機能で、(行数可変の)一覧表示をするために、DataGridを使おうと思ったのですが、 どのサンプルを見ても、DBから取得したRecordSetをBindする方法しか載っていません。 そもそもVB6のDataGridとは、プログラム中でDB以外の情報を、挿入したり削除することって、出来ないのでしょうか? (行オブジェクトをAddするようなイメージです) よろしくお願いします。

  • VB2008でコンボボックスのクリアについて

    VB2008でコンボボックスのクリアについて お世話になります。 コンボの設定を With ComboBox1 .Items.Clear() .Items.Add("a") .Items.Add("b") .SelectedIndex = 0 End With のようにしていた場合 ComboBox1.Items.Clear()を実行しても "a"の値がコンボに残るみたいなのですが、 指定の方法が悪いのでしょうか? .SelectedIndex = 0を指定しないと クリアされるみたいなのですが。 よろしくお願いいたします。

  • DataGridViewのコンボボックスについて

    DataGridViewのコンボボックスにおける初期インデックス値設定について  会社の用度管理に関するソフトを個人で作成しています。DataGridViewのコンボボックス でかなり悩んでおり、どなたか解決できる方がおられましたらご教示願います。 DataGridViewにてコンボボックスを「列の編集」時点で 作成し(columnType:DataGridViewComboBoxColumn)プログラム 段階で選択項目の準備をしています・・・・ --選択項目の準備------------------------------------------------ ※DataGridView名:GMN物品発注明細表 ※column名:処理選択 Dim column As New DataGridViewComboBoxColumn() 'ComboBoxのリストに表示する項目を指定 column.Items.Add("発 注") column.Items.Add("未発中") column.Items.Add("発注済") '"処理選択"列にバインドされているデータを表示 column.DataPropertyName = "処理選択" '"処理選択k"列の代わりにComboBox列を表示する GMN物品発注明細表.Columns.Insert(GMN物品発注明細表.Columns("処理選択").Index, column) GMN物品発注明細表.Columns.Remove("処理選択") column.Name = "処理選択" ------------------------------------------------------------------ ここまではいいのですが、表にデータを一行づつ挿入する際に「選択項目の準備」 にて作成したリストを行ごとに"発 注"・"未発中"・"発注済"の何れかを選択して 表示していきたいのです。行の挿入には --行の挿入処理------------------------------------------------------- ’行の挿入 GMN物品発注明細表.Rows.Add(New Object() {?,"1","2",・・・・・}) -------------------------------------------------------------------  「?」に何を指定すれば"発 注"・"未発中"・"発注済"の何れかを表示できるようになるか? お教え願えないでしょうか? GMN物品発注明細表.Rows.Add(New Object() {?,"1","2",・・・・・})の下に 「GMN物品発注明細表.Item(0, iRowCount).Value = "未発中"」 とかを追加してやると、Value値は"未発中"になりますが、表示されていない状況です。さらに インデックス値が分かるといいのですが。 ↓赤丸に初めから"発 注"・"未発中"・"発注済"の何れかを表示したいのですが・・・ 開発環境 Windows7/Xp等      VisualStudio2010

  • Gridに日付を入れるとき

    Gridに「2006/05/10 13:00:00」と表示させたいのですが、「2006/05/10」と表示されてしまいます。 ------------------------------------------------ Dim dt As DataTable Dim dtSet As New DataSet dt = dtSet.Tables.Add("aaa") dt.Columns.Add("日付", Type.GetType("System.DateTime")) dt.Rows.Add(New Object() {"2006/05/10 14:00:00"}) DataGrid1.DataSource = dt ------------------------------------------------ ソースが間違っているのでしょうか。どなたかアドバイスをお願いします。

  • コンボボックスにつきまして

    JComboBoxを使って、コンボボックスを作成したいのすが、 表示は名称で、実際の値取得はコードで取りたいのですが、 可能でしょうか? 例えば、 コード  名称 001   りんご 002   ぶどう 003   パイン というデータをセットし、 コンボボックスのドロップダウンでは「りんご」を選択したときには、 「001」という値を取得したいのです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • [C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません

    DataGridViewへのコンボボックス利用で躓いております。 DataGridViewのAutoGenerateColumnsをfalseにし、dataGridView.DataSourceにデータベースから読み込んだデータテーブルを指定しています。 次にdataGridViewにDataGridViewComboBoxColumnを追加し、DataPropertyNameにコンボボックスに対応させたい データテーブルのCaptionを指定することで、データテーブルとコンボボックスを関連付けています。 実行後の表示は想定通りなのですが、コンボボックスでアイテムを選択するとdataGridView上では値が更新されて、データテーブルには変更が反映されていません。 ちなみにコンボボックスでは、ValueMemberとDisplayMemberを設定し、DataGridView上ではstring、 内部的にはlongでデータ管理を行いたいと思っています。 どうにも解決方法が見いだせないので、こちらに質問させていただきました。 ソースを貼りつけるのでご指摘をお願いします。 利用しているデータベース |ID|ペットID| |1 |1| |2 |1| |3 |3| 以下ソースでは上記データベースのデータテーブルをpdtとしています。 コンボボックスのデータテーブル作成 DataTable comboTable = new DataTable(); comboTable.Columns.Add("ID", typeof(long)); comboTable.Columns.Add("NAME", typeof(string)); string[,] rowDataArray =      {{"1", "犬"},      {"2", "猫"},      {"3", "魚"}}; for(i=0;i<rowDataArray.GetLength(0);i++) {    DataRow row = comboTable.NewRow();    row["ID"] = rowDataArray[i, 0];    row["NAME"] = rowDataArray[i, 1];    comboTable.Rows.Add(row); } comboTable.AcceptChanges(); //コンボボックスを作成しコンボボックステーブルをバインド DataGridViewComboBoxColumn cbc = new DataGridViewComboBoxColumn(); cbc.DataSource = comboTable; cbc.DisplayMember = "NAME"; cbc.ValueMember = "ID"; cbc.DataPropertyName = pdt.ペットIDColumn.Caption; cbc.DisplayStyleForCurrentCellOnly = true; //dataGridViewにデータテーブルをバインド dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = pdt; dataGridView1.Columns.Add(cbc); これを実行すると |犬| |犬| |魚| とdataGridViewに表示され、コンボボックスでは、犬、猫、魚が選べます。 一行目において、コンボボックスから猫を選択するとdataGridViewは下記のようになるのですが |猫| |犬| |魚| この後ブレークよりデータテーブルとdataGridViewを見ると pdt[0][0] = 1 dataGridView1.Rows[0].Cells[0].Value = 2 となっており、dataGridViewの値は更新されているのに、データテーブルでは更新されていませんでした。 今まで、dataGridView上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、 コンボボックスを使うようにしたら更新されなくなりました。 皆様、解決方法を教えていただけますでしょうか。

専門家に質問してみよう