SHOEISHA iD

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

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

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

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

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

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

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

バウンドモードを使って更新系画面を作成しよう

 本稿の冒頭に説明したとおり、AccessDataSourceを使った例はヘルプファイルや添付サンプルコードにあるので、今回は、ObjectDataSourceを使ったバウンドモードについて取り上げたいと思います。

 MultiRow for ASP.NET 1.0Jに近い標準コントロールといえば、GridViewになると思います。MultiRowのバウンドモードを使った時の設定とGridViewには、一部相違があるので、そのあたりを中心に説明します。

 ObjectDataSourceと連結(バウンド)するためには、ObjectDataSourceで指定するデータアクセス用のクラスを作成しなければなりません。今回のサンプル(CZ1008Update2Sample)では、「CZ1008」というクラスを作成して使用しています。

 バウンドモードで使うときのMultiRowの設定でキーとなるのは、DataSourceIDプロパティとDataKeyNamesプロパティです。DataSourceIDプロパティにはObjectDataSourceの名前を設定し、DataKeyNamesプロパティにはレコードの主キーとなる列名を指定します。

 DataKeyNamesプロパティに設定した名前は、レコード削除時にレコードを特定するために使用します。また、MultiRowではDataKeyNamesプロパティが設定されていないとレコード削除のポストバックも発生しないので、注意してください。

リスト8 選択候補にデータソースを設定する例
<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側で設定して呼び出すように、意図的にしています。そのため、次のようなコードが必要です。

リスト9 選択候補にデータソースを設定する例
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を使った更新画面の作成方法を、アンバウンドモードを中心に説明してきました。バウンドモード部分での解説からも分かるとおり、アンバウンドモードで紹介したコードの大半は、バウンドモードでは不要になります(データアクセス用クラス、または相当のデータソース定義は必要です)。

 日本のビジネスシーンで必要な、細かな制御が必要な画面はアンバウンドモードで作成し、副次的な画面はバウンドモードで作成するなどすれば、気配りと効率化を両立できるのではないでしょうか。

製品情報

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング