- PR -

Datatableに行を追加、削除(DB登録有り)

投稿者投稿内容
ax
常連さん
会議室デビュー日: 2004/04/07
投稿数: 34
お住まい・勤務地: 東京
投稿日時: 2005-01-26 21:28
ASP .NETでDataGridにDataTableをバインドして、画面で追加、削除処理を行い、
グリッドとは別に配置してある登録ボタンをクリックしたタイミングでDataGridに
加えられた変更をまとめてDBに登録(OleDbAdapter.Update)する処理を作成しています。
DataGridへの行の追加削除は以下のようなコードになっています。
ここで、画面から追加、削除を繰り返すと、最後の行が消えなくなったりと、
なにかのタイミングでindexがずれてしまって困っています。
AcceptChangesという関数を使用すれば画面内では思い通りの動作をするのですが、
DBに登録する時点でまったく更新できなくなります。
なにか処理が抜けているのでしょうか?

Sub Add_Click(sender As Object, e As EventArgs)
Dim addrow as DataRow
objDataTable = CType(Session.Item("MyDataTable"), DataTable)
addrow = objDataTable.NewRow()
objDataTable.Rows.Add(addrow)
DataGrid1.EditItemIndex = objDataTable.Rows.Count - 1
With DataGrid1
.DataSource = objDataTable
.DataBind()
End With
End Sub

Sub DataGrid1_DeleteCommand(sender As Object, e As DataGridCommandEventArgs)

objDataTable = CType(Session.Item("MyDataTable"), DataTable)
objDataTable.Rows(e.Item.ItemIndex).Delete()
Session.Item("MyDataTable") = objDataTable
With DataGrid1
.DataSource = objDataTable
.DataBind()
End With

End Sub
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-01-27 01:03
とりあえず思いつくのは、
Add_ClickでSessionに入れてないのはいいんですか?
ということです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-01-27 05:52
引用:

AcceptChangesという関数を使用すれば画面内では思い通りの動作をするのですが、
DBに登録する時点でまったく更新できなくなります。
なにか処理が抜けているのでしょうか?


AcceptChangesを実行したらDataRowの更新履歴が初期化されますから
DataAdapterのUpdateメソッドを実行しても追加、削除したレコードは、データベースに
反映されないと思うのですが。

通常、DataAdapterのUpdateメソッドを実行すると、システムが内部的にAcceptChangesを実行してDataRowの履歴を初期化する仕掛けになっています。

AcceptChangesを使用する目的は?
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-01-27 05:57
引用:

ここで、画面から追加、削除を繰り返すと、最後の行が消えなくなったりと、
なにかのタイミングでindexがずれてしまって困っています。


この原因を追究することが先決だと思うのですが。

DataTableをセッションステートに保存すると、ユーザー間で別々のDataTableを確保することになりますが、問題ありませんか? DataTableを再作成するタイミングは?
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
ax
常連さん
会議室デビュー日: 2004/04/07
投稿数: 34
お住まい・勤務地: 東京
投稿日時: 2005-01-27 09:26
Add_Clickでセッションに格納している行は抜けていました。実際は格納しています。
AcceptChangesは試しに使ってみたら画面上はうまく動作したというだけです。
今試してるのは、削除と追加の動作だけなので、影響があるのはその2つのボタンクリック時のコードかなと考えています。とりあえず、行いたい動作はデータテーブルに加えられた修正を一括してDBに登録する、ということです。もちろん画面上での編集も追加、削除が正しく動作しないとだめなのですが、私が載せたソースに関わらず、このような動作をするサンプルなどご存知ないでしょうか?
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2005-01-27 11:09
私からはあと一点だけ。
EditItemIndexの行は、DataBindの後ろにもっていかないと
ダメでは。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-27 12:40
DataTable から削除した行は DataBind の対象にならないけれど DataTable には存在するため、EditItemIndex を求める際に table.Rows.Count を使用しているのが問題なのでは。

だから、AcceptChanges() を実行して Deleted の行を除けば「うまく」動いたように見えるのではないかと。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2005-01-27 13:47
objDataTable.Rows(e.Item.ItemIndex).Delete()

でe.Item.ItemIndexで行位置をしてされていますよね。
ItemIndexはデータグリッド内の行位置を指しており、
それがデータテーブル内の行位置と異なっているために
上手く動作していないとか。
あとは他の方が言われているように
DataGrid1.EditItemIndex = objDataTable.Rows.Count
でobjDataTable.Rows.Countを使われているのが問題かなと

うちではプライマリキーの値を取得してそれに基づいて
データテーブルの行を新規・変更・削除をかけて
データグリッド外のボタンでデータテーブルの内容を
データベースに反映していますが、うまく動作しています。


[ メッセージ編集済み 編集者: べーちゃん 編集日時 2005-01-27 13:52 ]

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