【ASPNET】ASP.NET VB GridViewのヘッダーに行を追加する(修正版)

ASP.NET VB GridViewのヘッダーに行を追加する際に新たなことが分かったので、追加でシステム開発備忘録します。

以前にASP.NET VB GridViewのヘッダーに行を追加するという記事をシステム開発備忘録しました。
その際に、PostBackでおかしくなる旨の記述もしていたのですが、今回の修正で治るかもしれません。

前回の追加コーディングは。以下の通りです。

Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
 
If e.Row.RowType = DataControlRowType.Header Then
  Dim row As GridViewRow = New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)
  For i As Integer = 0 To 11
    Dim cell1 As TableCell = New TableCell()
    cell1.Text = i.tostring + "月"
    row.Cells.Add(cell1)
  Next
  row.RowType = DataControlRowType.Header
  Me.GridView1.Controls(0).Controls.AddAt(1, row)
endif

今回、GridViewにtheadタグ、tbodyタグを追加したいと思い以下のコーディングを追加しました。

Private Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated

  Select Case (e.Row.RowType)
    Case DataControlRowType.Header
      e.Row.TableSection = TableRowSection.TableHeader  'theadを出力
    Case DataControlRowType.DataRow
      e.Row.TableSection = TableRowSection.TableBody    'tbodyを出力
    Case DataControlRowType.Footer
      e.Row.TableSection = TableRowSection.TableFooter  'tfootを出力
  End Select
End Sub

このコーディングを追加した結果、上で追加したレコードはTheadに入らずに、Tbodyに入っていました。
環境が異なるので今回は検証をしていませんので、あくまでも推測ですが、先回のPostBack時の不具合はこのことが原因と考えられます。
適切にthead部に入ってヘッダー行と認識されて居れば、PostBack時の処理で通常のレコードと見なされることは無いのではないかと思います。

そこで今回の結果を踏まえ、もう少し突っ込んで調べた結果、
TableSection
なるプロパティが有ることがわかりました。
TableSectionプロパティは、Table コントロールに配置されている TableRow オブジェクトの場所を取得または設定するのに使用されます。
使用できるテーブルの位置については、以下の通りです。

テーブル行セクション 表示モード
TableHeader ヘッダー行
TableBody テーブルの本体
TableFooter フッター行

TableSectionプロパティを設定する箇所は適当で良いと思いますが、私は直線に入れました。

row.TableSection = System.Web.UI.WebControls.TableRowSection.TableHeader
Me.GridView1.Controls(0).Controls.AddAt(1, row)

TableSection プロパティをTableHeaderに設定してヘッダーレコードを追加すると、正常にthead部に入ってくれました。

以上、ASP.NET VB GridViewのヘッダーに行を追加する(修正版)のシステム開発備忘録でした。