- PR -

DataGridViewでComboBox列の値の確定のタイミング

1
投稿者投稿内容
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-11-26 12:27
いつも、こちらの会議室にはお世話になっています。

現在、Visual Basic 2005 で、Windowsアプリケーションの開発を行っており、
フォームにDataGridViewコントロールを置いて、明細入力のプログラムを作成しております。

入力は、コンボボックスのみで行っており、DataGridViewComboBoxColumn列を使用しています。

コンボボックスの表示内容は、{空白, "昇順", "降順"}で、各表示内容はデータベースのテーブルに持たせている、[SORT]列の{0,1,2}に対応させたいと思っています。

以下のようなコードで、DataGridViewの各列にデータバインドを行っています。

With Me.dgvSelectedItems
.Columns.Add(Me.txtColSelectedRowNo) ' 行番号表示用
.Columns.Add(Me.txtColSort) ' 値の反映を見たいのでテスト用に追加しただけ
.Columns.Add(Me.cmbColSort) ' コンボボックス

.DataSource = Me.dtSelectedItems
End With

Me.txtColSelectedRowNo.DataPropertyName = "COLUMN_NO"

Me.txtColSort.DataPropertyName = "SORT"

' 並順コンボボックス用のデータソースを作成
Dim sortTable As New DataTable("SortTable")
sortTable.Columns.Add("Sort", GetType(Short))
sortTable.Columns.Add("SortName", GetType(String))
sortTable.Rows.Add(0, Space(1))
sortTable.Rows.Add(1, "昇順")
sortTable.Rows.Add(2, "降順")

' cmbColSort
Me.cmbColSort.DataPropertyName = "SORT"
Me.cmbColSort.DataSource = sortTable
Me.cmbColSort.ValueMember = "Sort"
Me.cmbColSort.DisplayMember = "SortName"

この、コンボボックス列で、あるセルの値を選択して変更し、そのセルを選択状態にしたままのDataSourceのDataTableのUpdateメソッドを呼び出すと、そのセルのレコードは、変更が反映されません。

別のセルを選択すると、変更は確定されるのですが、コンボボックスの表示内容を変更した時点で、DataTableに変更が反映するようにできないでしょうか。

DataGridViewのCurrentCellDirtyStateChangedイベントに以下のように記述すると、
ブレークポイントを置いて、デバッグモードでステップ実行を行うと、変更が反映されるのですが、通常に実行すると、変更は反映されませんでした。

With Me.dgvSelectedItems
Select Case .CurrentCellAddress.X
Case Me.cmbColSort.Index
'コミットする
If .IsCurrentCellDirty Then .CommitEdit(DataGridViewDataErrorContexts.Commit)
End Select
end With

どなたか、解決方法をご存知の方がいらっしゃいましたら、よろしくお願いいたします。


[ メッセージ編集済み 編集者: むーみん 編集日時 2007-11-26 13:53 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-26 13:07
引用:

この、コンボボックス列で、あるセルの値を選択して変更し、そのセルを選択状態にしたままのDataSourceのDataTableのUpdateメソッドを呼び出すと、そのセルのレコードは、変更が反映されません。


この処理を行う直前に、DatagridView.EndEdit()呼んだらどうなります?
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-11-26 13:39
引用:

かずくんさんの書き込み (2007-11-26 13:07) より:
引用:

この、コンボボックス列で、あるセルの値を選択して変更し、そのセルを選択状態にしたままのDataSourceのDataTableのUpdateメソッドを呼び出すと、そのセルのレコードは、変更が反映されません。


この処理を行う直前に、DatagridView.EndEdit()呼んだらどうなります?



かずくんさん、どうもありがとうございます。

DataTableのUpdateメソッドの前に、DataGridViewのEndEditメソッドを呼び出す行を追加して実行しました。

その結果、現象は変わりませんでした。

更新時の現象を先ほどは書かなかったので、以下に追記いたします。

Updateメソッドが呼び出され、データベースが更新された後に、
DataGridViewのtxtColSort列(コンボボックスのDataPropertyと同じDataPropertyを持ちます/テストのための列です。)に表示される値は、変更後の値に変わります。

しかし、実際にデータベースのレコードを見ると、変更は反映されていません。


自分でも調べてみます。
どうもありがとうございます。
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2007-11-26 18:29
解決しました。

結論をいうと、DataTableのUpdateメソッドを呼び出すのを、
更新Buttonをフォーム上に置いて、それをClickしたタイミングで行っていたのですが、
そのButtonのCausesValidationプロパティをFalseにしてしまっていたため、
DataTableにDataGridViewの内容が反映されていなかったようでした。

このプロパティをTrueに変更したら、変更がデータベースに反映されました。

とっても初歩的な部分を見落としてしまっていまして、
私の投稿で考えて下さった方、申し訳ありませんでした。

どうもありがとうございました。
1

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