ASP.NETにおけるObjectDataSourceコントロールの活用、続きです。前回は、ObjectDataSourceのあらましと、選択メソッド(SelectMethod)を書いてみました。今回は、データバインドコントロールのページング機能に対応するために、取得レコードの範囲を指定できるタイプのメソッドと、その他の必要なメソッドについて書いてみましょう。
【プログラミング】ASP.NETのObjectDataSource活用(1)―ADO.NETで作る(1)
いろいろ調べて試してみましたところ(こればっかし)、ページング機能に対応するためには、ObjectDataSourceに以下の設定が必要とわかりました。
- EnablePagingプロパティをTrueに。
- startRowIndexParameterName, maximumRowsParameterNameプロパティに適切なパラメータ名を設定する(デフォルトのままでOK)。また、SelectParametersコレクションに対応するパラメータを追加する。
- SelectCountMethodプロパティにレコード数取得のためのメソッド名を設定。
- SelectMethod, SelectCountMethodプロパティに相当するメソッドの実体を書く。
なんかちょっと複雑ですね。
EnablePagingプロパティをTrueにするのは、ObjectDataSourceがページングに対応していることを示すもので、必須です。このプロパティがFalseのままで、ページングを有効にしたデータバインドコントロールのデータソースとすると、実行時にエラーとなります(Trueにしても、メソッドの実体がなければエラーになりますが)。
startRowIndexParameterName, maximumRowsParameterNameプロパティに設定されているパラメータ名は、取得したいレコード番号(0~)と取得したい最大レコード数を受け取るものとして認識されます。これはつまり、メソッドの実体にこのパラメータを加える必要があるということを意味します。
そして、SelectCountMethodプロパティにレコード数取得のためのメソッド名を設定します。SelectMethodプロパティと同様です。
最後に、SelectMethod, SelectCountMethodプロパティに相当するメソッドの実体を書きます。このうち、SelectMethodについては前回の記事で書いていますが、上記のパラメータを追加して、かつレコード範囲の取得に対応させるために、大幅なコードの書き換えが必要になります。SelectCountMethodは完全な追加です。
メソッドのシグネチャにも注意する点があるのですが、実際のコードを書いていってしまいましょう。最初は、SelectMethodです。
[DataObjectMethod(DataObjectMethodType.Select)]
public DbDataReader getPhotoDataReader(int startRowIndex, int maximumRows,
int category, int direction)
{
内容省略。
db.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
処理内容は省略しておきます。前回の記事のgetPhotoDataReaderのシグネチャと比較すると、引数にstartRowIndex, maximumRowsが追加されているのがわかります。ここでObjectDataSource側のSelectParametersコレクションにこれらの引数が追加されていなければなりません(ウィザードを使うと自動で追加されますが、手動で書き込んでもOKです)。
<asp:Parameter Name="startRowIndex" Type="Int32" DefaultValue="0" />
<asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="0" />
くどいようですが、ObjectDataSourceのstartRowIndexParameterName, maximumRowsParameterNameプロパティに設定されている値が、上記のパラメータ名と一致するようにして下さい(ちなみに上記は既定値です)。
次は、レコード数を取得するSelectCountMethodです。
[DataObjectMethod(DataObjectMethodType.Select)]
public int getPhotoCount(int startRowIndex, int maximumRows,
int category, int direction)
{
内容省略。
db.Open();
int count = (int)command.ExecuteScalar();
db.Close();
return count;
}
こちらも処理内容は省略します。お気付きでしょうが、シグネチャがSelectMethodと同じです。このように、SelectMethodとSelectCountMethodは同じシグネチャを持つ必要があり、SelectParametersコレクションを共有します。また、int型を返すように書く必要があります。
さて、メソッドの形を書いたら、あとは実体(省略された内容)を書くだけです。実は、ここは簡単なようで簡単ではありませんでした。この先も長くなりそうですので、次の回に続けます。