アンバウンドモードでのデータ更新
アンバウンドモードでのデータ更新は、ツールバーやショートカットキーの操作によって発生します。サンプル(CZ1008UpdateSample)では、RowInsertingイベント、RowUpdatingイベント、RowDeletingイベントでデータベースに変更点を反映しています。
データベースにデータを追加する方法
Protected Sub MultiRow1_RowInserting(ByVal sender As Object, ByVal e As GrapeCity.Web.MultiRow.RowInsertingEventArgs) _ Handles MultiRow1.RowInserting If e.Values("Number") Is Nothing Then e.Values("Number") = Me.MultiRow1.Template.Row.Cells("Number").NullValue End If If e.Values("UnitPrice") Is Nothing Then e.Values("UnitPrice") = Me.MultiRow1.Template.Row.Cells("UnitPrice").NullValue End If e.Values("Price") = e.Values("Number") * e.Values("UnitPrice") Try Using _proc As New CZ1008Bound Dim ds As Data.DataSet = _proc.GetSchema("admin", "", "WS-DF502") Dim row As Data.DataRow = ds.Tables("Bill").NewRow() row("CustomerID") = Me.ViewState("CustomerID").ToString row("Date") = e.Values("Date") row("Products") = e.Values("Products") row("Number") = e.Values("Number") row("UnitPrice") = e.Values("UnitPrice") row("Price") = e.Values("Price") row("SlipNo") = e.Values("SlipNo") row("Category") = e.Values("Category") ds.Tables("Bill").Rows.Add(row) If _proc.InsertRecord("admin", "", "WS-DF502", ds) Then e.Values("ID") = ds.Tables("Bill").Rows(0).Item("ID") Else e.Cancel = True End If End Using Catch ex As Exception e.Cancel = True End Try End Sub
リスト2は、「追加した行の整形」「追加した行をデータセットに反映」「データセットを渡してデータベースに追加」という、3つの部分からできています。
なお、e.Values
の各要素が追加したMulitRowの1行分のデータになります。複数行編集したときには複数回イベントが発生します。
(1)追加した行の整形
UnitPriceとNumberはNullValueプロパティを設定していますが、NullValueプロパティの値はあくまでも表示のためのもので、未入力の状態で追加操作が完了したときはNothing値になっています。そのため、該当するNullValue値(Me.MultiRow1.Template.Row.Cells("Number").NullValue
)をコードで設定します。
Price値は、参照専用セルで「UnitPrice × Number」から自動計算します。
(2)追加した行をデータセットに反映
追加した行を反映するデータセット(具体的にはデータテーブル)には、構造を定義してからDataRowを追加することになります。
サンプルでは、データアクセス用のCZ1008クラスにデータテーブルの構造を定義するGetSchema
メソッドを実装しているので、GetSchema
メソッドで取得したデータテーブルに対して「ds.Tables("Bill").NewRow()
」を実行して編集用DataRow領域を確保し、そこにe.Values
の値を転記しています。
(3)データセットを渡してデータベースに追加
データベースへの追加は、データアクセス用のCZ1008クラスを使って行っています。
CZ1008のInsertRecord
メソッドの戻り値が「True
」ならID値が返却されてくるので、「e.Values("ID")
」に値を設定します。メソッドの戻り値が「False
」ならば、データベースへの追加が行われなかったということなので「e.Cancel
」に「True
」を設定して、データの追加処理をキャンセルします。
データベースにデータ変更を反映する方法
Protected Sub MultiRow1_RowUpdating(ByVal sender As Object, ByVal e As GrapeCity.Web.MultiRow.RowUpdatingEventArgs) _ Handles MultiRow1.RowUpdating e.NewValues("Price") = e.NewValues("Number") * e.NewValues("UnitPrice") Try Using _proc As New CZ1008Bound Dim ds As Data.DataSet = _proc.GetSchema("admin", "", "WS-DF502") Dim row As Data.DataRow = ds.Tables("Bill").NewRow() row("ID") = e.NewValues("ID") row("CustomerID") = Me.ViewState("CustomerID").ToString row("Date") = e.NewValues("Date") row("Products") = e.NewValues("Products") row("Number") = e.NewValues("Number") row("UnitPrice") = e.NewValues("UnitPrice") row("Price") = e.NewValues("Price") row("SlipNo") = e.NewValues("SlipNo") row("Category") = e.NewValues("Category") ds.Tables("Bill").Rows.Add(row) If _proc.UpdateRecord("admin", "", "WS-DF502", ds) Then Else e.Cancel = True End If End Using Catch ex As Exception e.Tag = ex.Message e.Cancel = True End Try End Sub
リスト3は、「編集した行の整形」「編集した行をデータセットに反映」「データセットを渡してデータベースを更新」という3つの部分からできています。
(1)編集した行の整形
Price値は、参照専用セルで「UnitPrice × Number」から自動計算します。
(2)編集した行をデータセットに反映
編集した行を反映するデータセット(具体的にはデータテーブル)には、構造を定義してからDataRowを追加することになります。
サンプルでは、データアクセス用のCZ1008クラスにデータテーブルの構造を定義するGetSchema
メソッドを実装しているので、GetSchema
メソッドで取得したデータテーブルに対して「ds.Tables("Bill").NewRow()
」を実行して編集用DataRow領域を確保し、そこにe.Values
の値を転記しています。
(3)データセットを渡してデータベースを更新
データベースへの更新は、データアクセス用のCZ1008クラスを使って行っています。
CZ1008のUpdateRecord
メソッドの戻り値が「True
」なら、更新成功です。メソッドの戻り値が「False
」ならば、データベースへの更新が行われなかったということなので、e.Cancel
に「True
」を設定して、データの更新処理をキャンセルします。
データベースからデータを削除する方法
Protected Sub MultiRow1_RowDeleting(ByVal sender As Object, _ ByVal e As GrapeCity.Web.MultiRow.RowDeletingEventArgs) _ Handles MultiRow1.RowDeleting If Not e.Values("ID") Is Nothing Then Using _proc As New CZ1008Bound If _proc.DeleteRecord("admin", "", "WS-DF502", e.Values("ID").ToString) Then '削除成功 Else e.Tag = "削除失敗" e.Cancel = True End If End Using Else 'まだ保存していない追加行はDBへの反映不要 End If End Sub
データベースからデータを削除するのに必要なのは、追加や編集と違い、削除行が特定できる情報だけです。RowDeletingイベントでは、e.Values
に削除する行のデータが格納されているので、主キーに相当する「e.Values("ID").ToString
」をデータアクセス用クラスライブラリに渡して、データベースからデータを削除しています。
また、サンプルでは、追加行はデータベースに保存したときにID値が振られる仕様になっているので、「e.Values("ID") Is Nothing
」の時はデータベースへの反映ロジックを通さずに、RowDeletingイベントプロシージャから抜けています。