GridView の標準の Pager の描画カスタマイズ
GridView のページャーについて (MSDN Forum) の、どっとねっとふぁんさんの投稿。GridView の Cell の中にある PagerTable の中にある Cell の中にある...という奥深く。
ControlCollection coll = e.Row.Cells[0].Controls[0].Controls[0].Controls; for (int i = 0; i < coll.Count; i++) { Control c = coll[i]; if (c is Label) { // 現在アクティブなページのラベル (c as Label).Text = (i * this.GridView1.PageSize + 1).ToString(); } else if (c is LinkButton) { // 現在アクティブでないページへのリンクボタン (c as LinkButton).Text = (i * this.GridView1.PageSize + 1).ToString(); } }
とかすると、PageSize=15 であれば、
1 16 31 46
みたいな、要素のインデックス番号を表示するページャーになります。これは強引ながらもかなりお手軽な方法ですね。NextPrevPager などに対して画像を指定した場所には、LinkButton ではなく ImageButton が配置されます。また、スタイル設定を行うだけであれば、WebControl 型にすると CssClass プロパティや Style プロパティにアクセスできるようになるので、
foreach (Control c in e.Row.Cells[0].Controls[0].Controls[0].Controls) { WebControl wc = c.Controls[0] as WebControl; if (wc != null) { wc.CssClass = (wc is Label) ? "CurrentPage" : "NavigatePage"; } }
みたいなかんじで CssClass のみ設定して、あとはスタイルシートでやってしまうのも良いかとおもいます。
強引でない方法を取ろうとすると、
PagerTemplate を設定するか、GridView の派生クラスを作成して、InitializePager() を override して必要な実装を行うべきなんでしょうけど、デフォルトのページャーはボタン数の設定やコールバックの対応など、機能が盛りだくさんなので、こういったアプローチでデフォルトのページャーを利用することで、非常に楽ができます。
そもそも、PagerTemplate を利用して標準の Number スタイルのページャーぐらいの機能を作り込もうと思ったら非常に大変です。前後ページに移動するだけとか、固定数のページに飛ぶ程度の内容なら、PagerTemplate もお手軽なんですけどね。