@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DataGridViewのLostFocus時にデータが更新できない事がある

1
投稿者投稿内容
mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 2007-01-12 11:35
御世話になります。
XP + VS2005(VB2005)による開発です。
DataGridViewにDBデータ(2列×n件)を表示、フォーカス喪失時にその内容をDBに反映さ
せたいのですが、成功する時と失敗する時があります。
(失敗と言ってもエラーにはならず、OleDbDataAdapter.Updateの返す更新件数が0で、
データも更新されていない状態ですが)
----------------------------------------------------------------------
成功時:
 例えば1行・1列目のセルを編集し、2行・1列目など別の行のセルに移動し、
 その後フォーカスを喪失(別のコントロールへ移動、フォームクローズ)
 した場合
失敗時:
 例えば1行・1列目のセルを編集し、その後フォーカスを喪失した場合
 ※別の行へ移動しない
----------------------------------------------------------------------
CellValueChanged でも試みたのですが、結果は同じでした。
失敗時の例のパターンでもデータを更新させる方法は無いでしょうか?
どなたか御教授下さい。
宜しく御願い致します。
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-12 19:24
こんばんは。

単純にLostFocusイベントの中で編集確定してあげれば良いと思うのですが・・・。
デバッグで、何故更新されないかは確認されましたか?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-01-12 22:47
LostFocusは低水準イベントなので、.NETでは代わりにLeaveを使う方が良いようです。

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.lostfocus(VS.80).aspx

他の行にセルを移動すると正しく更新されることから考えますと、
行の編集が確定されてないのではないかと思います。
CurrencyManager.EndCurrentEdit あたりでどうでしょうか?
mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 2007-01-12 23:32
御世話になります。
梶さん、KIさん、ありがとうございます。

梶さん:
『編集確定』とはどうすれば、編集確定になるのでしょうか?
書いていませんでしたが、Update前に該当セルに対してEndEditメソッドを行っても
結果は同じでした。
因みに何故更新されないか?ですが、デバッグ出力したところ、該当行のRosStateが
Unchangedに設定されています。
これ以上は、何を調べてよいのか解らず…

KIさん:
とりあえず、DataGridViewのLeaveイベントに以下のコードを書きました
----------------------------------------------------------------------
Dim cm As CurrencyManager = _
CType(Me.BindingContext(DataGridView1.DataSource, _
DataGridView1.DataMember), CurrencyManager)
cm.EndCurrentEdit()

updateTable() ' Adapter.Update を行うサブルーチン
----------------------------------------------------------------------
が、結果は同じでした。
もしかして、的外れなことをしていますでしょうか?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-01-13 01:39
DataGridView.EndEdit → DataRowView.EndEdit の順に呼んでみてください。

DataGridView.EndEditはセルの編集を確定し、
編集内容をDataRowViewに格納しますが、先にDataRowView.BeginEditが
暗黙的に呼び出されているので、新しい値はProposedバージョンに格納され、
この時点ではDataRowのRowStateはUnchangedのままです。
行の編集内容を確定するにはDataRowView.EndEditを呼び出す必要があります。
CurrencyManager.EndCurrentEditでも解決できるようですが、
MSDNによると「お勧めしない」そうです。失礼しました。

コード:
DataGridView1.EndEdit()
DirectCast(DataGridView1.CurrentRow.DataBoundItem, DataRowView).EndEdit()

mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 2007-01-13 03:17
御世話になります。
KIさん、ありがとうございます。
御陰様で御提示頂いたコードにより実現できました。
DataGridViewはもちろん、VS2005自体が初めてなもので、手が付けれずに困っておりま
した。
有難う御座いました。
1

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