トップ回答者
DataPagerでのカスタム表示

質問
-
初めて投稿します。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日目)何がおかしいのかわかりません。
よろしくお願いします。
回答
-
> どうも「+」の演算が、加算ではなく文字列連結になってしまうようです。
それは違うと思います。
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
-
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>
すべての返信
-
> どうも「+」の演算が、加算ではなく文字列連結になってしまうようです。
それは違うと思います。
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
-
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さま
解決されたようで良かったですね。
よろしければ解決につながった回答に、「回答としてマーク」をしていただけると、後で検索した人が有益な回答を見つけやすくなります。また、回答者のポイントも上がります。よろしくお願いいたします。
#追記
モデレータが回答としてマークするより、質問者さんがそうする方がポイントが高くなります。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2014年6月6日 7:29 追記
-
Hoshinaです
こんにちは横から口をはさみます。
質問者さんがご自身で修正コードを書き込んだ投稿も,回答としてマークに十分該当するのではないでしょうか?
質問者自身の投稿に,回答としてマークをつけることがマナー違反とは思いませんので,
次回以後,この内容に興味を持ってもらえるかどうかを判断にして,或る程度柔軟に設定することをお勧めしたいです。あまり反対者はいなそうに思いますし,一度ご自身の投稿に回答としてマークをつけた後で,再度外されているようなので,
老婆心から投稿してみました。但し,回答としてマークをつけるのは,議論に結論が出てからをお勧めします。
既に回答済みと判断して,閲覧者が中を見てくれない可能性もありますからね。それでは