- - PR -
Datatableに行を追加、削除(DB登録有り)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2005-01-27 01:03
とりあえず思いつくのは、
Add_ClickでSessionに入れてないのはいいんですか? ということです。 | ||||
|
投稿日時: 2005-01-27 05:52
AcceptChangesを実行したらDataRowの更新履歴が初期化されますから DataAdapterのUpdateメソッドを実行しても追加、削除したレコードは、データベースに 反映されないと思うのですが。 通常、DataAdapterのUpdateメソッドを実行すると、システムが内部的にAcceptChangesを実行してDataRowの履歴を初期化する仕掛けになっています。 AcceptChangesを使用する目的は? _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2005-01-27 05:57
この原因を追究することが先決だと思うのですが。 DataTableをセッションステートに保存すると、ユーザー間で別々のDataTableを確保することになりますが、問題ありませんか? DataTableを再作成するタイミングは? _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2005-01-27 09:26
Add_Clickでセッションに格納している行は抜けていました。実際は格納しています。
AcceptChangesは試しに使ってみたら画面上はうまく動作したというだけです。 今試してるのは、削除と追加の動作だけなので、影響があるのはその2つのボタンクリック時のコードかなと考えています。とりあえず、行いたい動作はデータテーブルに加えられた修正を一括してDBに登録する、ということです。もちろん画面上での編集も追加、削除が正しく動作しないとだめなのですが、私が載せたソースに関わらず、このような動作をするサンプルなどご存知ないでしょうか? | ||||
|
投稿日時: 2005-01-27 11:09
私からはあと一点だけ。
EditItemIndexの行は、DataBindの後ろにもっていかないと ダメでは。 | ||||
|
投稿日時: 2005-01-27 12:40
DataTable から削除した行は DataBind の対象にならないけれど DataTable には存在するため、EditItemIndex を求める際に table.Rows.Count を使用しているのが問題なのでは。
だから、AcceptChanges() を実行して Deleted の行を除けば「うまく」動いたように見えるのではないかと。 | ||||
|
投稿日時: 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 ] |