バウンドモードを使って更新系画面を作成しよう
本稿の冒頭に説明したとおり、AccessDataSourceを使った例はヘルプファイルや添付サンプルコードにあるので、今回は、ObjectDataSourceを使ったバウンドモードについて取り上げたいと思います。
MultiRow for ASP.NET 1.0Jに近い標準コントロールといえば、GridViewになると思います。MultiRowのバウンドモードを使った時の設定とGridViewには、一部相違があるので、そのあたりを中心に説明します。
ObjectDataSourceと連結(バウンド)するためには、ObjectDataSourceで指定するデータアクセス用のクラスを作成しなければなりません。今回のサンプル(CZ1008Update2Sample)では、「CZ1008」というクラスを作成して使用しています。
バウンドモードで使うときのMultiRowの設定でキーとなるのは、DataSourceIDプロパティとDataKeyNamesプロパティです。DataSourceIDプロパティにはObjectDataSourceの名前を設定し、DataKeyNamesプロパティにはレコードの主キーとなる列名を指定します。
DataKeyNamesプロパティに設定した名前は、レコード削除時にレコードを特定するために使用します。また、MultiRowではDataKeyNamesプロパティが設定されていないとレコード削除のポストバックも発生しないので、注意してください。
<GrapeCity:MultiRow ID="MultiRow1" runat="server" MultiSelect="False" AllowPaging="True"
ScrollMode="Row" Width="540px"
DataSourceID="ObjectDataSource1" DataKeyNames="ID" >
ObjectDataSourceの設定でポイントとなるのは、InsertParametersやUpdateParametersにはMultiRowの各セルに指定したDataField名を、すべて指定しなければならない点です。
例えば、今回のサンプルでは「数量 × 単価」から金額を計算しているので、追加時や更新時はサーバー側で自動計算を行うため、ロジックとしてはInsertParametersやUpdateParametersに指定は不要です。しかし、指定しておかないと実行時に、指定していないDataFieldがパラメタとして自動的に追加されるため、データアクセス用のクラスのパラメタと合わなくなり実行時エラーが発生するので、注意してください。
バウンドモードでは、通常はaspx.vb側には何も記述をする必要はありません。ただ、今回のサンプルではデータアクセス用クラスを呼ぶときに、「UserID」「パスワード」「請求NO」は画面ではなくaspx.vb側で設定して呼び出すように、意図的にしています。そのため、次のようなコードが必要です。
Partial Class MultiRowSample
Inherits System.Web.UI.Page
Private block As Object = Nothing
Protected Sub Me_Load(ByVal sender As Object,
ByVal e As System.EventArgs) _
Handles MultiRowSample_Form.Load
Me.ObjectDataSource1.SelectParameters("userID").DefaultValue = "admin"
Me.ObjectDataSource1.SelectParameters("password").DefaultValue = ""
Me.ObjectDataSource1.SelectParameters("billNo").DefaultValue = "WS-DF502"
End Sub
Protected Sub MultiRow1_RowDeleting(ByVal sender As Object,
ByVal e As RowDeletingEventArgs) _
Handles MultiRow1.RowDeleting
Me.ObjectDataSource1.DeleteParameters("userID").DefaultValue = "admin"
Me.ObjectDataSource1.DeleteParameters("password").DefaultValue = ""
Me.ObjectDataSource1.DeleteParameters("billNo").DefaultValue = "WS-DF502"
End Sub
Protected Sub MultiRow1_RowInserting(ByVal sender As Object,
ByVal e As RowInsertingEventArgs) _
Handles MultiRow1.RowInserting
Me.ObjectDataSource1.InsertParameters("userID").DefaultValue = "admin"
Me.ObjectDataSource1.InsertParameters("password").DefaultValue = ""
Me.ObjectDataSource1.InsertParameters("billNo").DefaultValue = "WS-DF502"
End Sub
Protected Sub MultiRow1_RowUpdating(ByVal sender As Object,
ByVal e As RowUpdatingEventArgs) _
Handles MultiRow1.RowUpdating
Me.ObjectDataSource1.UpdateParameters("userID").DefaultValue = "admin"
Me.ObjectDataSource1.UpdateParameters("password").DefaultValue = ""
Me.ObjectDataSource1.UpdateParameters("billNo").DefaultValue = "WS-DF502"
End Sub
Protected Sub MultiRow1_RowPreRender(ByVal sender As Object,
ByVal e As RowPreRenderEventArgs) _
Handles MultiRow1.RowPreRender
If e.Tag.Length > 0 Then
e.Row.ErrorText = e.Tag
End If
End Sub
End Class
各モードの使い分けで細かい制御と効率化の両立を
今回は、MultiRow for ASP.NETを使った更新画面の作成方法を、アンバウンドモードを中心に説明してきました。バウンドモード部分での解説からも分かるとおり、アンバウンドモードで紹介したコードの大半は、バウンドモードでは不要になります(データアクセス用クラス、または相当のデータソース定義は必要です)。
日本のビジネスシーンで必要な、細かな制御が必要な画面はアンバウンドモードで作成し、副次的な画面はバウンドモードで作成するなどすれば、気配りと効率化を両立できるのではないでしょうか。

