バウンドモードを使って更新系画面を作成しよう
本稿の冒頭に説明したとおり、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を使った更新画面の作成方法を、アンバウンドモードを中心に説明してきました。バウンドモード部分での解説からも分かるとおり、アンバウンドモードで紹介したコードの大半は、バウンドモードでは不要になります(データアクセス用クラス、または相当のデータソース定義は必要です)。
日本のビジネスシーンで必要な、細かな制御が必要な画面はアンバウンドモードで作成し、副次的な画面はバウンドモードで作成するなどすれば、気配りと効率化を両立できるのではないでしょうか。