VB.NET2003のDataGridでコンボボックス
- 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)) で取得できますが、実際の値を取得する方法がわかりません。 ご存知の方いらっしゃいましたら、ご教授ください。 それと、行毎に違う値(リストデータ)のコンボボックスを作成することはできますでしょうか? 以上です。よろしくお願いします。
- Visual Basic
- 回答数2
- ありがとう数4
- みんなの回答 (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 にて行っております。 法則を変更したければ、そちらを改造してください。
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>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列目用のスタイルを作成しマッピングしてあげたらよいです。
お礼
わざわざコードまでご丁寧にありがとうございます! おかげさまで値の取得ができました! >>毎に違う値(リストデータ)のコンボボックスを作成 >できます。 >グリッドに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 ------------------------------------------------- 上記内容の場合、コンボボックスをクリックしても 選択肢としては"空白"しか表示されません。 セットした値をコンボボックスの選択肢として表示させる方法を ご存知の方がいらっしゃいましたら、ご教授願えますでしょうか?
- ベストアンサー
- Visual Basic
- 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)
- ベストアンサー
- Visual Basic
- コンボボックスのマウスホイールを無効にしたい
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
- ベストアンサー
- Visual Basic
- VBでコンボボックスとテキストボックスの連係
VBでフォームにデータコンボボックスとテキストボックスを一つづつ作り、データコンボボックスで値を選択し、その値に対する値をテキストボックスに表示させたいんですがどうすればいいでしょうか? データコンボボックスで選択する元になるテーブルは ID | 商品 1 | みかん 2 | ばなな 3 | りんご と、上記のような形のテーブルをもちいています。 例えばデータコンボボックスで「1」を選択した場合テキストボックスに「みかん」と表示させたいです。
- ベストアンサー
- Visual Basic
- VB6 DBと連結しないDataGrid
VB6の標準機能で、(行数可変の)一覧表示をするために、DataGridを使おうと思ったのですが、 どのサンプルを見ても、DBから取得したRecordSetをBindする方法しか載っていません。 そもそもVB6のDataGridとは、プログラム中でDB以外の情報を、挿入したり削除することって、出来ないのでしょうか? (行オブジェクトをAddするようなイメージです) よろしくお願いします。
- ベストアンサー
- Visual Basic
- VB2008でコンボボックスのクリアについて
VB2008でコンボボックスのクリアについて お世話になります。 コンボの設定を With ComboBox1 .Items.Clear() .Items.Add("a") .Items.Add("b") .SelectedIndex = 0 End With のようにしていた場合 ComboBox1.Items.Clear()を実行しても "a"の値がコンボに残るみたいなのですが、 指定の方法が悪いのでしょうか? .SelectedIndex = 0を指定しないと クリアされるみたいなのですが。 よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- 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 ------------------------------------------------ ソースが間違っているのでしょうか。どなたかアドバイスをお願いします。
- ベストアンサー
- Visual Basic
- コンボボックスにつきまして
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上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、 コンボボックスを使うようにしたら更新されなくなりました。 皆様、解決方法を教えていただけますでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
お礼
ありがとうございました! できました!! 本当にお世話になりました。 >あまり難しく考えず、コードをよく見てみましょうね^^; そうですね^^; 反省・・・。 じっくりコードを見直して勉強します!