SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(MultiRow)

一覧更新画面を持つWebアプリの作り方~MultiRow for ASP.NETの編集機能を使いこなす!

1レコード複数行表示を実現するMultiRow for ASP.NETの実力(後編)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (83.3 KB)

アンバウンドモードでのデータ更新

 アンバウンドモードでのデータ更新は、ツールバーやショートカットキーの操作によって発生します。サンプル(CZ1008UpdateSample)では、RowInsertingイベント、RowUpdatingイベント、RowDeletingイベントでデータベースに変更点を反映しています。

データベースにデータを追加する方法

リスト2 アンバウンドモードでデータを追加
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」を設定して、データの追加処理をキャンセルします。

データベースにデータ変更を反映する方法

リスト3 アンバウンドモードでデータ変更
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」を設定して、データの更新処理をキャンセルします。

データベースからデータを削除する方法

リスト4 アンバウンドモードでデータ削除
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イベントプロシージャから抜けています。

次のページ
ドロップダウンリストの選択候補をバインドする

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(MultiRow)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5402 2010/09/02 15:15

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング