SHOEISHA iD

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

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

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

複雑な一覧だからこそGUI画面でデザインしたい! Webで1レコード複数行表示を実現するMultiRow for ASP.NETの実力

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

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

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

MultiRow for ASP.NETでページングを実装する

 MultiRow for ASP.NETにはページングを行うためのプロパティがあります。それがAllowPagingプロパティです。AllowPagingプロパティをTrueに設定しておけばPageSizeプロパティに設定された行数ごとにページングできます。

 このように設定することによりDataSourceに割り当てられたデータソースに含まれているデータ全体からカレントページの先頭位置を算出してPageSizeプロパティの行数だけを表示します。データソース全体を対象にするのでデータソース自身にはページング機能の実装などは不要です。

図9 [ページングを有効にする]にチェックを入れる。デフォルトの設定は1ページ10行表示
図9 [ページングを有効にする]にチェックを入れる、デフォルトの設定は1ページ10行表示

MultiRow for ASP.NETでObjectDataSourceのページングを利用する

 取り扱うデータが膨大でパフォーマンスが気になる場合は、少し手間がかかりますが、ObjectDataSourceのページング機能を併用することで、高パフォーマンスなページの作成が可能です(サンプルソース「CZ1007PagerSample」)。

図10 ページング機能付きMultiRow定義例
図10 ページング機能付きMultiRow定義例

 今回、データベースからの値の入出力は、すべて「CZ1007Bound」クラスで実装しています。そこで、ObjectDataSourceを介してページングに必要な動作を行うメソッドを「CZ1007Bound」クラスに追加し、ページング機能付きMultiRowを実現してみましょう。

ページング機能付きデータアクセスクラス

 「CZ1007Bound」クラスにページング機能を実装するためには、いくつかの約束事を守ったメソッドを実装しなければなりません。

 必要なメソッドは「レコード数を取得する」メソッドと、「先頭から数えてn個目からm個のレコードを取得する」メソッドの2つです。この2つのメソッドのパラメタは、同一にしなければなりません。

 今回のサンプルでは、「レコード数を取得する」メソッドとしてGetNumberOfOrdersメソッドを実装します。本来は先頭3つのパラメタだけで十分ですが、ObjectDataSourceで使われることを前提として、startRowIndexmaximumRowsパラメタが追加されています。

リスト4 GetNumberOfOrders
Public Function GetNumberOfOrders(ByVal userID As String,
                                  ByVal password As String,
                                  ByVal billNo As String,
                                  ByVal startRowIndex As Integer,
                                  ByVal maximumRows As Integer) As Integer
    Dim rows As Integer = 0

    Using _cn As New OleDb.OleDbConnection()
        _cn.ConnectionString = String.Format(System.Configuration.ConfigurationManager.AppSettings("ConnectionString"),
                                             userID,
                                             password)
        _cn.Open()
        Using _cmd As New OleDb.OleDbCommand
            _cmd.Connection = _cn
            _cmd.CommandText =
                "SELECT COUNT(*) " &
                  "FROM Customers " &
                 "INNER JOIN (Bill INNER JOIN BillCondition " &
                                     "ON Bill.BillNo = BillCondition.BillNo)" &
                    "ON Customers.CustomerID = Bill.CustomerID " &
                 "WHERE Bill.BillNo=? "
            _cmd.Parameters.AddWithValue("@billNo", billNo)
            rows = CType(_cmd.ExecuteScalar, Integer)
        End Using
        _cn.Close()
    End Using
    Return rows
End Function

 「先頭から数えてn個目からm個のレコードを取得する」メソッドとしては、GetRecordsByIndexメソッドを実装します。nmは、それぞれstartRowIndexmaximumRowsというパラメタ値として、このメソッドに渡ってきます。

リスト5 CZ1007Bound.vbファイルの内容
Public Function GetRecordsByIndex(ByVal userID As String,
                                  ByVal password As String,
                                  ByVal billNo As String,
                                  ByVal startRowIndex As Integer,
                                  ByVal maximumRows As Integer) As DataSet
    Dim ds As New DataSet
    Using _cn As New OleDb.OleDbConnection()
     :
   (中略)
     :
    End Using
    Return ds
End Function

ページング機能付きデータアクセスクラスをObjectDataSourceで利用

 「CZ1007Bound」クラスをObjectDataSourceで利用するために、設定が必要なメソッドとしては次のものがあります。

表1 プロパティ設定値
プロパティ 用途 設定値
TypeName クラス名を指定 CZ1007Bound
SelectMethod レコード取得用メソッド名 GetRecordsByIndex
SelectCountMethod 件数取得用メソッド名 GetNumberOfOrders
EnablePaging True:ページング True

 ObjectDataSourceに対してページング機能を有効(EnablePaging=True)にすると、StartRowIndexParameterNameメソッドとMaximumRowsParameterNameメソッドの設定値も有効になります。

 StartRowIndexParameterNameメソッドは、カレントページの先頭に表示する行位置を「CZ1007Bound」クラスに渡すためのパラメタ名で、デフォルト値として「startRowIndex」が指定されています。

 MaximumRowsParameterNameメソッドは、ページ内の行数を「CZ1007Bound」クラスに渡すためのパラメタ名で、デフォルト値として「maximumRows」が指定されています。

 ここで指定したパラメタ名をSelect時に使うためのは、パラメータコレクションエディターを使います。

図11 パラメータコレクションエディター
図11 パラメータコレクションエディター

 このように設定しておけば、リスト3に相当するコードを記述しなくても、「CZ1007Bound」クラスのメソッドが自動的に呼び出されてデータを取得します。そのため「aspx.vb」ファイルの内容は、リスト6のように初期状態のままになっています。

リスト6 MultiRowSample.aspx.vbファイルの内容
Partial Class MultiRowSample
    Inherits System.Web.UI.Page

End Class

実行

図12 ページング機能付きMultiRowの実行例
図12 ページング機能付きMultiRowの実行例

 フッタのページ数をクリックすれば、該当ページに移動もできます。クリックするたびにパラメタにも適切な値が設定されて、「CZ1007Bound」クラスのGetRecordsByIndexメソッドが自動的に呼び出されます。

次回予告

 今回は参照画面について、Repeaterコントロールよりも簡単な使い方を紹介しました。次回は、MultiRowを使った更新画面など、さらに詳細な使い方を応用編として紹介します。

製品情報

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

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

もっと読む

この記事の著者

初音玲(ハツネアキラ)

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

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5351 2010/09/13 16:59

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング