Answers:
应该这样做:
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,而不是使用custom-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);
}
}
我知道这很旧,但是,这是对MikeTeeVee答案的一种解释,适用于标准gridview:
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;
}
}