QA@IT

ASP.NET Webフォームで抽出とページング

5466 PV

こんにちは。

VS2015 C# ASP.NETにて、テキストボックスに入力した値でデータ(SQLServer)を抽出し、
GridViewに表示されるというWebフォームを開発しております。
今回質問させて頂きますのは、ページングを実装した場合、最初のページ以外で抽出を実行させますと、
GridViewに何も表示されなくなるという件です。

ページの方は↓

<form id="form1" runat="server">
    <asp:TextBox ID="txtMaker" runat="server"></asp:TextBox>
    <asp:GridView ID="gvData" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateEditButton="True" AutoGenerateSelectButton="True" 
        SelectMethod="GetAssets" UpdateMethod="UpdateAssets" 
        DataKeyNames="ID" ItemType="assetman.Models.PCAsset">
        <PagerStyle HorizontalAlign="Right" />
    </asp:GridView>
</form>

ビハインドの方は↓

public IQueryable<PCAsset> GetAssets([Control("txtMaker")] string maker)
{
    var db = new adm();
    IQueryable<PCAsset> query = db.PCAsset;
    if (!String.IsNullOrEmpty(maker))
    {
        query = query.Where(o => o.Maker == maker);
    }
    return query;
}

テキストボックス(txtMaker)が空欄の時、PCAssetテーブルから全件表示(10件毎にページング)させ、
文字列を入力した時は合致するデータのみ抽出してGridViewに表示させる…という機能にしたいです。
仮にページングで5ページになったとして、1ページ目ですと文字列入力して抽出は正常に表示されるのですが、
2ページ目、3ページ目で同様にすると、GridViewには何も表示されません。

どなたかご指摘頂ければ幸いです。よろしくお願い致します。

回答

GridView 組み込みの並べ替え、更新、削除、およびページングの各機能が利用できるのは、データソースコントロール (SqlDataSource、ObjectDataSource など) と組み合わせて使った場合のみです。(ASP.NET 4.5 から質問者さんが使っている SelectMethod というプロパティが追加されたようですが、それにはそういう機能はないようです)

MSDN ライブラリの GridView クラスの「データへのバインド」のセクションを読んでください。

GridView クラス
https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview(v=vs.100).aspx

データソースコントロールを使わない場合は、ページャークリックでポストバックされたら SQL Server にクエリを投げてデータを取得し、クリックされたページャーのページの部分のみのレコードを切り取って、それを GirdView にデータバインドするという操作を自力でコードを書いて実装しなければなりません。

質問者さんのコードにはその部分が実装されてないので「2ページ目、3ページ目で同様にすると、GridViewには何も表示されません」ということになるのでしょう。

SqlDataSource を使えば、コードを一行も書くことなくウィザードベースでクエリなどを設定するだけで簡単にページング機能を実装できます。そちらの方向に進むことをお勧めします。

三層構造にしたいのであれば、型付 DataSet + TableAdapter を Visual Studio のウィザードで作って(具体例は以下の記事を参照)、それを ObjectDataSource 経由で利用すると言うことも可能です

7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_01.html

ページを切り替えるたびに全レコードを取得するという負荷が大きい動作(ウィザードベースで作るとそうなります)を避けたいのであれば、その対応も可能です。詳しくは以下の記事を見てください(記事では ListView を使っていますが GridView でも可能です)。

ObjectDataSource でページング
http://surferonwww.info/BlogEngine/post/2010/08/26/Paging-with-ObjectDataSource.aspx

編集 履歴 (0)
  • SurferOnWwwさん、ご回答誠に有難うございます。

    SQLServerからのデータ取得は、Entity Frameworkを使って今回やってみました。
    一度、ご指摘頂いたようにデータソースコントロールを使って実装してみたいと存じます。
    お忙しい中、誠に有難うございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。