QA@IT

ASP.NET(C#4.0)のGridViewでのヘッダを2行にする(thead/tbodyを出力するようにした場合)

7297 PV

はじめまして
ASP.NETで、WEBページを作成しているのですが、
行き詰まっています

GridViewのヘッダを2行にする方法がわかりません
通常のGridViewで、ヘッダを2行にするのはあちこちにいろいろな方法があるのですが
グリッドをtheadとtbodyを出力して、ヘッダとデータ部を分離した場合の方法がわかりません
データバインド部を以下のようにし
//thead/tbody出力
protected void GridView1_DataBound(object sender, EventArgs e)
{
//タグの準備
GridView1.UseAccessibleHeader = true;
//ヘッダをtheadタグで作成
GridView1.HeaderRow.TableSection = TableRowSection.TableHeader;
//フッタをtfooterタグで作成
GridView1.FooterRow.TableSection = TableRowSection.TableFooter;
if (GridView1.Rows.Count > 0) {
}
}

以下のPreRender部で、ヘッダの追加を行っているのですが元から存在するヘッダの先頭がつぶれてしまいます
protected void GridView1_PreRender(object sender, EventArgs e)
{
//ヘッダを2行にする
GridViewRow rowss = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);

    TableHeaderCell cell1 = new TableHeaderCell();
    cell1.Text = "aaa";
    rowss.Cells.Add(cell1);

    TableHeaderCell cell2 = new TableHeaderCell();
    cell2.Text = "bbb";
    rowss.Cells.Add(cell2);

    TableHeaderCell cell3 = new TableHeaderCell();
    cell3.Text = "ccc";
    rowss.Cells.Add(cell3);

    TableHeaderCell cell4 = new TableHeaderCell();
    cell4.Text = "ddd";
    rowss.Cells.Add(cell4);

    TableHeaderCell cell5 = new TableHeaderCell();
    cell5.Text = "eee";
    rowss.Cells.Add(cell5);
    //実際のヘッダ追加(元からあるヘッダをつぶしてしまう)
    GridView1.HeaderRow.Controls[0].Controls.AddAt(-1, rowss);
}

cssでヘッダとデータに対してデザインをしていて、これを省くのは難しいです
ヘッダに行を追加するところが間違っていると思うのですが、どう間違っているのかわかりません
正しい追加の仕方はどうしたらいいのでしょうか

回答

すべて GridView.RowCreated イベントのハンドラでやるとうまく良くと思います。以下のような感じです。

それより、ASP.NET 3.5 から追加された ListView を使うことをお勧めします。

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.TableSection = System.Web.UI.WebControls.TableRowSection.TableHeader;

        GridViewRow row = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
        TableHeaderCell headerCell = new TableHeaderCell();
        headerCell.ColumnSpan = e.Row.Cells.Count;
        headerCell.Controls.Add(new LiteralControl("ヘッダー")); ;
        row.Cells.Add(headerCell);
        row.TableSection = System.Web.UI.WebControls.TableRowSection.TableHeader;
        ((GridView)sender).Controls[0].Controls.AddAt(-1, row);         

    }
    else if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.TableSection = System.Web.UI.WebControls.TableRowSection.TableBody;
    }
    else if (e.Row.RowType == DataControlRowType.Footer)
    {
        e.Row.TableSection = System.Web.UI.WebControls.TableRowSection.TableFooter;
    }
}
編集 履歴 (0)

ありがとうございます
1行ごとに、ヘッダかデータ部か指定しておいて、
その中で追加すれば良かったんですね

試してみたところうまくいきました

リストビューは試してみて、これから提案してみます

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。