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 もお手軽なんですけどね。