- PR -

DataGrid における更新処理について

1
投稿者投稿内容
F.ISHII
会議室デビュー日: 2002/07/17
投稿数: 10
投稿日時: 2002-07-17 12:16
Windows2000、VB.NET、SQL Server2000 です。

SqlDataAdapter1 、DataSet11、DataGrid、Button1
が貼り付けてある WindowForm があります。
Button1 の Text プロパティは「更新(&U)」と設定してあり、コードを以下のように記述しました。

Private Sub Form1_Load(--略--) Handles MyBase.Load
SqlDataAdapter1.Fill(DataSet11, "テーブル名")
End Sub

Private Sub Button1_Click(--略--) Handles Button1.Click
SqlDataAdapter1.Update(DataSet11, "テーブル名")
End Sub

Private Sub Form1_Closing(--略--) Handles MyBase.Closing
SqlDataAdapter1.Update(DataSet11, "テーブル名")
End Sub

ほぼ思った通りの動作となるのですが、DataGrid のカレント行を編集中に
Button1 をクリックした時と、キーボードから ALT+U と操作した時で処理が異なる問題を解決できずにいます。

前者では、カレント行の修正内容が反映されて Update されるのに対して、後者では反映されません。
また、フォーム右上の×ボタンでフォームを閉じた場合は後者の処理となります。

希望は、Button1 クリック時のように、反映される処理に統一したいのですが、良い案はありますでしょうか?
tipriva
会議室デビュー日: 2002/07/17
投稿数: 4
投稿日時: 2002-07-17 14:43
DataGridに「EndEdit」というメソッドがあります。
ヘルプの中にコードもかかれてますので参照してみてください。
3者(ボタンクリック、ショートカットキー、閉じる)における動作の違いはコントロールのフォーカス移動の関係で起きるのではないかと思います。
試した限りではボタンクリックのときにはフォーカスの移動がおき、それでEndEditが実行されたかたちになるのではないでしょうか。
あと、グリッドではなくフォームに連結しているときには「Me.BindingContext(データセット, テーブル名).EndCurrentEdit」を使います。
どちらも、編集中のカレントレコードをデータセットに反映する働きがあります。
tipriva
会議室デビュー日: 2002/07/17
投稿数: 4
投稿日時: 2002-07-17 14:46
すみません。先ほどの書き込みに付け加えます。

よって、Updateをかける前に前述のカレントをデータセットに反映するコードを追加すればよいかと思います。
F.ISHII
会議室デビュー日: 2002/07/17
投稿数: 10
投稿日時: 2002-07-17 16:34
tiprivaさん、回答を頂き有難うございました。

> 動作の違いはコントロールのフォーカス移動の関係で起きるのではないか

につきましては、当方もそのように考えております。

その後、アドバイスに基づき試して見たのですがまだ解決できておりません。

Dim intRow As Integer
Dim dgc As DataGridColumnStyle = _
DataGrid1.TableStyles(0).GridColumnStyles(0)

intRow = DataGrid1.CurrentCell.RowNumber
DataGrid1.EndEdit(dgc, intRow, True) ' False
SqlDataAdapter1.Update(DataSet11, "テーブル名")

上のようにしてみたのですが、カレントが鉛筆マークのままです。
よくわからないのは、EndEditメソッドの最初の引数が GridColumnStyles である点です。
イメージとして行の編集状態というよりもカラムの編集状態に対して効くように思えるの
ですが、如何でしょうか?


tipriva
会議室デビュー日: 2002/07/17
投稿数: 4
投稿日時: 2002-07-17 20:16
実際に試してみましたが、おっしゃるとおりですね。
いろいろ調べてみましたが、これといったものは探せなかったです。

スマートではないのですが、取り合えず次のコードをアップデート前に置くとうまくいきました。

Me.DataGrid1.Select(DataGrid1.CurrentRowIndex)

もっと、いい方法がありそうな気がするのですが.....
F.ISHII
会議室デビュー日: 2002/07/17
投稿数: 10
投稿日時: 2002-07-18 08:19
tipriva さん、おはようございます。
いろいろお骨折りを頂きありがとうございます。

早速試してみたのですが、鉛筆マークは消えるもののデータベースへの反映はされない
ようです。

Private Sub Button1_Click(--略--) Handles Button1.Click
Me.DataGrid1.Select(DataGrid1.CurrentRowIndex)
SqlDataAdapter1.Update(DataSet11, "テーブル名")
End Sub


こちらでも引き続き試行錯誤はしてみようと思います。
tipriva
会議室デビュー日: 2002/07/17
投稿数: 4
投稿日時: 2002-07-18 08:54
Private Sub Form1_Closing(引数略)
 Me.DataGrid1.Select(DataGrid1.CurrentRowIndex)        …… (1)
 Me.BindingContext(データセット, テーブル名).EndCurrentEdit()  …… (2)
 Me.OleDbDataAdapter1.Update(データセット, テーブル名)
End Sub

(2)のコードが抜けていませんか。
コントロールによって変更されたデータがデータセットに反映されるのはカレント(ポジション)が移動したときです。よって、カレント(ポジション)を変更せずにUpdateをかけるには(2)のコードでカレントの編集結果をデータセットに反映させる必要があります。
(1)については、前の書き込みのとおり、無理やりにやっていることですが、(2)は必須となります。
F.ISHII
会議室デビュー日: 2002/07/17
投稿数: 10
投稿日時: 2002-07-18 16:37
tipriva さん。
有難うございました。
お蔭様で解決できました。

単票形式(DataGridを使わない場合)は、
Me.BindingContext(データセット, テーブル名).EndCurrentEdit()
を使っておりましたが、DataGrid を使う場合でも必須ということですね。

早々とご回答頂きながらご報告が遅れまして申し訳御座いませんでした。
1

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