none
DataPagerでのカスタム表示 RRS feed

  • 質問

  • 初めて投稿します。C# も Webアプリも初めてでいたるところでハマっています。

    Webフォームで「ListView + DataPager」を使って、一覧表示のページングを行っているのですが、ページャーのカスタムフィールドがうまく表示できません。

    PageSize=10のページングで

    1ページ目は 1-10
    2ページ目は 11-20
    3ページ目は 21-30

    と何件目から何件目を表示しているかを出力しているのですが、2ページ目を表示すると、101-110と出力されてしまいます。

    どうも「+」の演算が、加算ではなく文字列連結になってしまうようです。
    いろいろやってみましたが解決することができませんでした。

    <asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1">
      <Fields>
        <asp:TemplatePagerField>
          <PagerTemplate>
            <asp:Label runat="server" ID="PageLabel1" Text="<%# Container.TotalRowCount>0 ? ((Container.StartRowIndex * Container.PageSize) + 1) : 0 %>" />
            -
            <asp:Label runat="server" ID="PageLabel2" Text="<%# (Container.StartRowIndex + 1) * Container.PageSize < Container.TotalRowCount ? (Container.StartRowIndex + 1) * Container.PageSize : Container.TotalRowCount %>" />
          </PagerTemplate>
        </asp:TemplatePagerField>
        :
        :
      </Fields>
    </asp:DataPager>

    <環境>
    Windows 7
    Visual Studio 2013 for Web
    SQL Server Express 2012 の LocalDB
    言語: C#
    Webサイトプロジェクト

    すごく基本的なところでつまづいているのだと思いますが、経験が浅く(3日目)何がおかしいのかわかりません。

    よろしくお願いします。

     

    2014年6月6日 3:36

回答

  • > どうも「+」の演算が、加算ではなく文字列連結になってしまうようです。

    それは違うと思います。

    DataPager (データバインド式の中の Container)の各プロパティの意味は以下の通りです。(詳しくは MSDN ライブラリを見てください)

    StartRowIndex: ページに表示される最初のレコードのインデックス
    PageSize:   各ページに表示されるレコード数
    TotalRowCount: レコードの合計数

    PageSize は 10 なので、レコード数が 21 以上ある場合 2 ページ目では StartRowIndex は 10 となり、

    PageLabel1: StartRowIndex x PageSize + 1 = 10 x 10 + 1 = 101
    PageLabel2: ( StartRowIndex + 1 ) x 10 = (10 + 1 ) x 10 = 110

    というように 101 - 110 となって、期待した 11 - 20 と違という結果になっているのでしょう。

    どう修正すればいいのかは分かりますよね。

    • 回答としてマーク Ticky4649 2014年6月6日 7:53
    2014年6月6日 5:00
  • SurferOnWwwさん、レスありがとうございました。

    StartRowIndexをページインデックスと勘違いしていたのが原因だったのですね。
    デバッグしてプロパティの内容を確認すればよかったのでしょうけど、まだデバッグのやり方すらわかってなかったので。。。
    とにかく、ようやっと長いトンネルを抜けることができました。ありがとうございました。

    あぁ、先が思いやられる。。。

    修正コード

    <asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1">
      <Fields>
        <asp:TemplatePagerField>
          <PagerTemplate>
            <asp:Label runat="server" ID="PageLabel1" Text="<%# Container.TotalRowCount>0 ? Container.StartRowIndex + 1 : 0 %>" />
            -
            <asp:Label runat="server" ID="PageLabel2" Text="<%# (Container.StartRowIndex + Container.PageSize) > Container.TotalRowCount ? Container.TotalRowCount : Container.StartRowIndex + Container.PageSize %>" />
          </PagerTemplate>
        </asp:TemplatePagerField>
        :
        :
      </Fields>
    </asp:DataPager>
    

    • 回答としてマーク Ticky4649 2014年6月6日 7:53
    • 回答としてマークされていない Ticky4649 2014年6月6日 7:53
    • 回答としてマーク Ticky4649 2014年6月6日 8:35
    2014年6月6日 6:19

すべての返信

  • > どうも「+」の演算が、加算ではなく文字列連結になってしまうようです。

    それは違うと思います。

    DataPager (データバインド式の中の Container)の各プロパティの意味は以下の通りです。(詳しくは MSDN ライブラリを見てください)

    StartRowIndex: ページに表示される最初のレコードのインデックス
    PageSize:   各ページに表示されるレコード数
    TotalRowCount: レコードの合計数

    PageSize は 10 なので、レコード数が 21 以上ある場合 2 ページ目では StartRowIndex は 10 となり、

    PageLabel1: StartRowIndex x PageSize + 1 = 10 x 10 + 1 = 101
    PageLabel2: ( StartRowIndex + 1 ) x 10 = (10 + 1 ) x 10 = 110

    というように 101 - 110 となって、期待した 11 - 20 と違という結果になっているのでしょう。

    どう修正すればいいのかは分かりますよね。

    • 回答としてマーク Ticky4649 2014年6月6日 7:53
    2014年6月6日 5:00
  • SurferOnWwwさん、レスありがとうございました。

    StartRowIndexをページインデックスと勘違いしていたのが原因だったのですね。
    デバッグしてプロパティの内容を確認すればよかったのでしょうけど、まだデバッグのやり方すらわかってなかったので。。。
    とにかく、ようやっと長いトンネルを抜けることができました。ありがとうございました。

    あぁ、先が思いやられる。。。

    修正コード

    <asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1">
      <Fields>
        <asp:TemplatePagerField>
          <PagerTemplate>
            <asp:Label runat="server" ID="PageLabel1" Text="<%# Container.TotalRowCount>0 ? Container.StartRowIndex + 1 : 0 %>" />
            -
            <asp:Label runat="server" ID="PageLabel2" Text="<%# (Container.StartRowIndex + Container.PageSize) > Container.TotalRowCount ? Container.TotalRowCount : Container.StartRowIndex + Container.PageSize %>" />
          </PagerTemplate>
        </asp:TemplatePagerField>
        :
        :
      </Fields>
    </asp:DataPager>
    

    • 回答としてマーク Ticky4649 2014年6月6日 7:53
    • 回答としてマークされていない Ticky4649 2014年6月6日 7:53
    • 回答としてマーク Ticky4649 2014年6月6日 8:35
    2014年6月6日 6:19
  • Ticky4649さま
    解決されたようで良かったですね。
    よろしければ解決につながった回答に、「回答としてマーク」をしていただけると、後で検索した人が有益な回答を見つけやすくなります。また、回答者のポイントも上がります。

    よろしくお願いいたします。

    #追記
    モデレータが回答としてマークするより、質問者さんがそうする方がポイントが高くなります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年6月6日 7:23
    モデレータ
  • trapemiyaさん

    了解しました。マークしました。

    使い方がよくわかってなくて申し訳ありません。

    2014年6月6日 8:00
  • >使い方がよくわかってなくて申し訳ありません。

    いえいえ、ありがとうございました。引き続き開発の方、がんばって下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年6月6日 8:19
    モデレータ
  • Hoshinaです
    こんにちは

    横から口をはさみます。

    質問者さんがご自身で修正コードを書き込んだ投稿も,回答としてマークに十分該当するのではないでしょうか?
    質問者自身の投稿に,回答としてマークをつけることがマナー違反とは思いませんので,
    次回以後,この内容に興味を持ってもらえるかどうかを判断にして,或る程度柔軟に設定することをお勧めしたいです。

    あまり反対者はいなそうに思いますし,一度ご自身の投稿に回答としてマークをつけた後で,再度外されているようなので,
    老婆心から投稿してみました。

    但し,回答としてマークをつけるのは,議論に結論が出てからをお勧めします。
    既に回答済みと判断して,閲覧者が中を見てくれない可能性もありますからね。

    それでは

    2014年6月6日 8:19
  • Hoshinaさん

    アドバイスありがとうございます。

    間違って自分の投稿にマークしてしまったので解除してしまいましたが、別に解除しなくてもよかったのですね。

    いろいろ勉強になります。

    2014年6月6日 8:37