Gridview에서 THEAD를 렌더링하려면 어떻게해야합니까?


답변:


187

이렇게해야합니다.

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRow속성이 될 것입니다 null이 될 때까지 GridView데이터가 결합되어 있으므로 데이터 바인딩은 위의 코드를 실행하기 전에 발생한 때까지 대기해야합니다.
bdukes

6
아래의 설명과 같이 ASP.NET 4.5를 사용하면 적어도 바인딩 후에는 충분히 늦지 않습니다. 그러나 OnPreRender에서 작동합니다.
philw 2013-08-06

사용자 지정 하위 헤더가 추가 된 gridview가 있습니다. 이러한 각 하위 헤더는 데이터 소스의 데이터를 표시합니다. 렌더링하고 싶었던 이유 thead는 jQuery에서 사용하기 위해서입니다. 그러나 헤더를 렌더링 한 후에 tbody는 사용할 수없는 것 같습니다. 제 경우에는 무엇이 빠졌을까요?
bonCodigo 2014 년

1
포스트 백 중에 여전히 문제가 있음을 발견하고 모든 시나리오를 해결하는 데이터 바인딩 이벤트에 코드를 배치했습니다.
James Westgate 2015 년

사용자가 버튼을 클릭하면 데이터베이스에서 데이터를 가져옵니다. 이 경우 gridview에 thead 태그가 없습니다. 도움이 필요하세요?
touinta 2015-07-21

25

나는 이것을 OnRowDataBound이벤트 에서 사용합니다 .

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

7
이것은 나를 위해 일한 유일한 솔루션입니다. 누가이 끔찍한 컨트롤을 디자인 했습니까?
EKW

2
OnRowCreated 이벤트에 코드를 삽입하고 올바르게 작동하도록했습니다.
yougotiger

DataSource 내에 행이없는 경우 TableSection이 null이되는 위험 (및 필수 검사)을 제거하므로 최상의 솔루션입니다.
EvilDr 2018

1
참고로, (가) 경우 GridView내에 UpdatePanel와 비동기 포스트 백은 다음 몇 가지 다른 제어에 의해 발생 OnRowDataBound의 결과로, 이벤트 따라서이 답변의 코드가 실행되지 않습니다 제기되지 GridView않고 렌더링으로 되돌리기 <thead>태그 ... 한숨 . 이 경우를 대상으로하려면 수락 된 답변 의 코드를 gridView의 PreRender이벤트 처리기 로 밀어 넣습니다 ( ASalvo의 답변에서 제안하는 것과 매우 유사 함).
Mr.Z

WebForms 워크 플로를 올바르게 사용하므로 정답입니다.
마르셀

10

답변의 코드는 Page_Load또는 GridView_PreRender. 나는 다음에 호출 된 방법에 넣어 Page_Load하고있어 NullReferenceException.


4
DataBound이벤트에 넣을 수도 있습니다 . grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM 2010 년

4
이것이 .NET 4.5에서 다른지 모르겠지만 _DataBound 및 _PreRender 이벤트 처리기에서 HeaderRow가 null이됩니다. 이것은 gridView에서 ASP.NET Web Forms의 새로운 "모델 바인딩"기능을 사용하고 있다는 사실과 관련이있을 수 있습니다.
ClearCloud8

7

이 작업을 수행하려면 다음 코드를 사용합니다.

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에 붙여 넣을 수 있습니다 . 페이지에 사용자 지정 GridView 방식을 사용하는 대신 이름으로 GridView를 참조 있습니다.

참고 : 바닥 글 논리를 테스트하지는 않았지만 이것이 머리글에서 작동한다는 것을 알고 있습니다.


5

이것은 나를 위해 작동합니다.

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에서 시도되었습니다.


2

함수를 만들고 다음과 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);
        }
}

1

나는 이것이 오래되었다는 것을 알고 있지만 표준 gridview에 대한 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;
        }

    }

0

jQuery를 사용하여 추가 할 수도 있습니다. 이렇게하면 PostBack에서 삭제되는 TableRowSection.TableHeader의 문제를 방지 할 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.