none
GridViewのPage$Lastの値 RRS feed

  • 質問

  • お世話になっております。

    win2008r2で、.net framework4.0の場合は

    Page$Lastの値が正しく最終ページのインデックスが設定されていたのですが

    .net framework4.5にアップデートしたら

    Page$Lastの値が-1になるようになってしまいました。

    同じような現象が発生された方はございますでしょうか?

    仕様が変わったのかプログラムの書き方が悪いのか。

    ソースの抜粋は下記になります。

    aspxファイル

    <asp:GridView ID="grdList" runat="server" AllowPaging="True"
                    AllowCustomPaging="true"
                    AutoGenerateColumns="False"
                    onpageindexchanging="grdList_PageIndexChanging"
                    PageSize="20"
                    style="text-align: center" CssClass="grid_style" DataKeyNames="Mkrid"
                        DataSourceID="FileDataSource" onprerender="grdList_PreRender">

    <PagerSettings Position="TopAndBottom" Mode="NumericFirstLast" />

     </asp:GridView>

    csファイル

    protected void grdList_PageIndexChanging(object sender, GridViewPageEventArgs e)

    で、e.NewPageIndexの値が"-1”になってしまいます。

    2014年11月7日 2:39

回答

  • > プログラムを書き換えたりはしておりません。

    最初の質問にアップされていたコードには AllowCustomPaging="true" と書いてあります。

    今までは ASP.NET 4 の GridView ということですが、ASP.NET 4 の GridView には AllowCustomPaging プロパティというのは存在しません。どういうことでしょう? それを利用してのカスタムページングは ASP.NET 4.5 からの新機能です。そのことは理解されてますか? 

    想像ですが、以前から AllowCustomPaging="true" というコードが紛れ込んでいたが、ASP.NET 4 では意味をなさないので何の影響もなかった。しかし、Framework を ASP.NET 4.5 にアップデートしたらその影響が出て動かなくなったということではないですか?

    その想像が当たっていれば、AllowCustomPaging="true" というコードを削除すれば元通り動くようになるのではないかと思います。

    • 回答としてマーク kaz0923 2014年11月9日 23:48
    2014年11月7日 9:33

すべての返信

  • 自分は .NET4.5 の GridView を検証できる環境は持ってないのでハズレかもしれませんが・・・

    > .net framework4.5にアップデートしたら

    その意味は、ASP.NET 4.5 GridView の新機能カスタムページングを利用できるようにコードを書き換えたんですよね? (それは「.net framework4.5にアップデートした」とは言わないのでは?)

    GridView.AllowCustomPaging プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.allowcustompaging(v=vs.110).aspx

    上のページに以下のように書いてあります。

    "PageIndexChanging のイベントのハンドラーで、PageIndex のプロパティを新しいページ インデックス値に設定し、データ ソースの項目の総数に VirtualItemCount のプロパティを設定し、現在のページに必要な行だけを返すようにデータ ソースを設定します。DataBind のメソッドを呼び出します。"

    カスタムページングを利用しているのに、上記の設定をせずに、.NET 4 以前と同じようなことしているから期待通りに行かないのではないですか?

    ハズレだったらすみません。


    【追伸】

    ググって調べてみました。

    ASP.NET 4.5 の Custom Paging の設定については以下の記事が参考になると思います。

    Custom Paging With GridView in ASP.NET 4.5
    http://www.c-sharpcorner.com/UploadFile/99bb20/custom-paging-with-gridview-control-in-Asp-Net-4-5/

    .NET 4 以前で普通にページングを実装する時のように、Visual Studio のデザイン画面で SqlDataSource と GridView を Page に貼り付け、それらのプロパティをウィザードベースでチョコチョコっと設定すれば終わりというわけには行かないようです。

    ちなみに、同等なページングの機能は、ASP.NET 2.0 以降で利用できる ObjectDataSource でも実現できます。ご参考まで。

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


    【追伸2】

    > Page$Lastの値が-1になるようになってしまいました。

    そのあたり勘違いがありませんか?

    Page$Last というのは、ページャー中の最終ページ遷移するためのハイパーリンクで以下のように設定されているものですよね。

    <a href="javascript:__doPostBack(&#39;GridView1&#39;,&#39;Page$Last&#39;)">&gt;&gt;</a>
    

    そうであればそれが -1 になるなどということはありませんし、そもそもプログラマが参照したり設定したるするものではありません。
    • 編集済み SurferOnWww 2014年11月7日 4:54 追伸2追加
    2014年11月7日 4:00
  • SurferOnWww様

    回答ありがとうございます。

    何点か私の説明が悪く申し訳ございません。

    .net framework4.5にアップデートと記載したのは

    文字通り frameworkをアップデートしただけで

    プログラムを書き換えたりはしておりません。

    また、Page$Lastの値が-1については、省略をしすぎました。

    質問の最後に記載しておりますが

    GridViewPageEventArgsのNewPageIndexの値が"-1”になってしまっています。

    2014年11月7日 8:59
  • > プログラムを書き換えたりはしておりません。

    最初の質問にアップされていたコードには AllowCustomPaging="true" と書いてあります。

    今までは ASP.NET 4 の GridView ということですが、ASP.NET 4 の GridView には AllowCustomPaging プロパティというのは存在しません。どういうことでしょう? それを利用してのカスタムページングは ASP.NET 4.5 からの新機能です。そのことは理解されてますか? 

    想像ですが、以前から AllowCustomPaging="true" というコードが紛れ込んでいたが、ASP.NET 4 では意味をなさないので何の影響もなかった。しかし、Framework を ASP.NET 4.5 にアップデートしたらその影響が出て動かなくなったということではないですか?

    その想像が当たっていれば、AllowCustomPaging="true" というコードを削除すれば元通り動くようになるのではないかと思います。

    • 回答としてマーク kaz0923 2014年11月9日 23:48
    2014年11月7日 9:33
  • SurferOnWww様

    回答ありがとうございます。

    SurferOnWww様のおっしゃられる通り

    以前から AllowCustomPaging="true" というコードが紛れ込んでいたようで

    それが原因でした。

    削除したら解決しました。

    ありがとうございます。

    2014年11月9日 23:48