web-dev-qa-db-ja.com

GridviewでTHEADをレンダリングするにはどうすればよいですか?

<thead><tbody>タグをレンダリングするGridViewコントロールを取得するにはどうすればよいですか? .UseAccessibleHeaders<th>の代わりに<td>を配置することを知っていますが、<thead>を表示することはできません。

109
Andrew Bullock

これはそれを行う必要があります:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;
185
Phil Jenkins

OnRowDataBoundイベントでこれを使用します:

protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
    if (e.Row.RowType == DataControlRowType.Header) {
        e.Row.TableSection = TableRowSection.TableHeader;
    }
}
23
Neto Kuhn

答えのコードは、Page_LoadまたはGridView_PreRenderに進む必要があります。 Page_Loadの後に呼び出されたメソッドに入れて、NullReferenceExceptionを取得しました。

10
ASalvo

これを行うには、次のコードを使用します。

追加したifステートメントは重要です。

それ以外の場合(グリッドのレンダリング方法によって異なります)、次のような例外がスローされます。

テーブルには、ヘッダー、ボディ、フッターの順に行セクションが含まれている必要があります。

protected override void OnPreRender(EventArgs e)
{
    if ( (this.ShowHeader == true && this.Rows.Count > 0)
      || (this.ShowHeaderWhenEmpty == true))
    {
        //Force GridView to use <thead> instead of <tbody> - 11/03/2013 - MCR.
        this.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
    if (this.ShowFooter == true && this.Rows.Count > 0)
    {
        //Force GridView to use <tfoot> instead of <tbody> - 11/03/2013 - MCR.
        this.FooterRow.TableSection = TableRowSection.TableFooter;
    }
    base.OnPreRender(e);
}

thisオブジェクトは私のGridViewです。

実際にAsp.net GridViewをオーバーライドして独自のカスタムコントロールを作成しましたが、これをaspx.csページに貼り付け、custom-gridviewアプローチを使用する代わりに名前でGridViewを参照できます。

参考:フッターロジックはテストしていませんが、ヘッダーで機能することは知っています。

7
MikeTeeVee

これは私のために働く:

protected void GrdPagosRowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.TableSection = TableRowSection.TableBody;
    }
    else if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.TableSection = TableRowSection.TableHeader;
    }
    else if (e.Row.RowType == DataControlRowType.Footer)
    {
        e.Row.TableSection = TableRowSection.TableFooter;
    }
}

これはVS2010で試行されました。

4
Felipe Delgado

関数を作成し、次のようにPageLoadイベントでその関数を使用します。

機能は次のとおりです。

private void MakeGridViewPrinterFriendly(GridView gridView) {  
    if (gridView.Rows.Count > 0) {          
        gridView.UseAccessibleHeader = true;  
        gridView.HeaderRow.TableSection = TableRowSection.TableHeader;  
    }  
} 

PageLoadイベントは次のとおりです。

protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack)
        {
            MakeGridViewPrinterFriendly(grddata);
        }
}
2
Rajpurohit

私はこれが古いことを知っていますが、標準のグリッドビューについてのMikeTeeVeeの答えの解釈は次のとおりです。

aspxページ:

<asp:GridView ID="GridView1" runat="server" 
    OnPreRender="GridView_PreRender">

aspx.cs:

    protected void GridView_PreRender(object sender, EventArgs e)
    {
        GridView gv = (GridView)sender;

        if ((gv.ShowHeader == true && gv.Rows.Count > 0)
            || (gv.ShowHeaderWhenEmpty == true))
        {
            //Force GridView to use <thead> instead of <tbody> - 11/03/2013 - MCR.
            gv.HeaderRow.TableSection = TableRowSection.TableHeader;
        }
        if (gv.ShowFooter == true && gv.Rows.Count > 0)
        {
            //Force GridView to use <tfoot> instead of <tbody> - 11/03/2013 - MCR.
            gv.FooterRow.TableSection = TableRowSection.TableFooter;
        }

    }
1
Jonathan Harris

JQueryを使用して追加することもできます。これにより、PostBackでドロップされるTableRowSection.TableHeaderの問題を回避できます。

$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));

0
Michael