답변:
이렇게해야합니다.
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
속성이 될 것입니다 null
이 될 때까지 GridView
데이터가 결합되어 있으므로 데이터 바인딩은 위의 코드를 실행하기 전에 발생한 때까지 대기해야합니다.
thead
는 jQuery에서 사용하기 위해서입니다. 그러나 헤더를 렌더링 한 후에 tbody
는 사용할 수없는 것 같습니다. 제 경우에는 무엇이 빠졌을까요?
나는 이것을 OnRowDataBound
이벤트 에서 사용합니다 .
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
내에 UpdatePanel
와 비동기 포스트 백은 다음 몇 가지 다른 제어에 의해 발생 OnRowDataBound
의 결과로, 이벤트 따라서이 답변의 코드가 실행되지 않습니다 제기되지 GridView
않고 렌더링으로 되돌리기 <thead>
태그 ... 한숨 . 이 경우를 대상으로하려면 수락 된 답변 의 코드를 gridView의 PreRender
이벤트 처리기 로 밀어 넣습니다 ( ASalvo의 답변에서 제안하는 것과 매우 유사 함).
답변의 코드는 Page_Load
또는 GridView_PreRender
. 나는 다음에 호출 된 방법에 넣어 Page_Load
하고있어 NullReferenceException
.
DataBound
이벤트에 넣을 수도 있습니다 . grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
이 작업을 수행하려면 다음 코드를 사용합니다.
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를 참조 있습니다.
참고 : 바닥 글 논리를 테스트하지는 않았지만 이것이 머리글에서 작동한다는 것을 알고 있습니다.
이것은 나를 위해 작동합니다.
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에서 시도되었습니다.
함수를 만들고 다음과 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);
}
}
나는 이것이 오래되었다는 것을 알고 있지만 표준 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;
}
}