如何获得Gridview渲染THEAD?


Answers:


187

应该这样做:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRow属性将null一直存在,直到GridView已绑定数据为止,因此请确保等待数据绑定发生后再运行上面的代码行。
bdukes

6
正如下面的评论所述,至少在绑定之后使用ASP.NET 4.5还不够晚-但是它可以在OnPreRender中使用。
2013年

我有一个添加了自定义子标题的gridview。这些子标题中的每一个确实显示了来自数据源的数据。我想要渲染的原因thead是在jQuery中使用它。但是,在渲染头之后,tbody似乎不可用。我的情况可能缺少什么?
bonCodigo 2014年

1
我发现回发期间仍然存在问题,并将代码放在解决所有情况的数据绑定事件中。
詹姆斯·韦斯特盖特

当用户单击按钮时,我将从数据库中获取数据。在这种情况下,gridview缺少thead标签。有什么帮助吗?
touinta 2015年

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 '18年

1
据透露,如果GridView是内部的UpdatePanel和异步回发是由一些其它的控制,则导致OnRowDataBound事件将不会引发这样在这个答案的代码不会被执行,导致GridView恢复到不渲染<thead>标签...... 。为了解决这种情况,请将代码从接受的答案推入gridView的PreRender事件处理程序中(就像ASalvo的答案所建议的那样)。
Z先生

这是正确的答案,因为它正确使用了WebForms工作流程。
马塞尔(Marcel)

10

答案中的代码需要继续Page_LoadGridView_PreRender。我把它放在一个后来被调用的方法中,Page_Load并得到一个NullReferenceException


4
您也可以加入DataBound事件。grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM

4
不知道现在在.NET 4.5中是否不同...但是我在_DataBound和_PreRender事件处理程序中都将HeaderRow设置为null。这可能与我在gridView中使用ASP.NET Web窗体的新“模型绑定”功能有关。
2012年

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,而不是使用custom-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

我知道这很旧,但是,这是对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;
        }

    }

0

您也可以使用jQuery添加它。这避免了TableRowSection.TableHeader的问题,该问题在PostBack上被丢弃。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.