2008-11-21 4 views
98

Làm cách nào để có được điều khiển GridView để hiển thị các thẻ <thead><tbody>? Tôi biết .UseAccessibleHeaders làm cho nó đặt <th> thay vì <td>, nhưng tôi không thể nhận được <thead> xuất hiện.Làm cách nào để có Gridview hiển thị THEAD?

+0

FYI: UseAccessibleHeader là "true" theo mặc định, do đó bạn không cần phải đặt nó. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.useaccessibleheader.aspx – MikeTeeVee

Trả lời

168

này nên làm điều đó:

gv.HeaderRow.TableSection = TableRowSection.TableHeader; 
+64

Thuộc tính 'HeaderRow' sẽ là' null' cho đến khi 'GridView' bị ràng buộc dữ liệu, vì vậy hãy chắc chắn đợi cho đến khi databinding xảy ra trước khi chạy dòng mã trên. – bdukes

+4

Như bình luận dưới đây, với ASP.NET 4.5 ít nhất là sau khi ràng buộc là không đủ muộn - nó hoạt động trong OnPreRender tuy nhiên. – philw

+0

Tôi có chế độ xem lưới với tiêu đề phụ tùy chỉnh được thêm vào. Mỗi tiêu đề phụ này hiển thị dữ liệu từ nguồn dữ liệu. Lý do tôi muốn render 'thead' là sử dụng nó trong jQuery. Tuy nhiên sau khi hiển thị tiêu đề, 'tbody' dường như không có sẵn. Điều gì có thể bị thiếu trong trường hợp của tôi? – bonCodigo

9

Mã trong câu trả lời cần phải đi trên Page_Load hoặc GridView_PreRender. Tôi đặt nó vào một phương pháp được gọi sau số Page_Load và nhận được NullReferenceException.

+4

Bạn cũng có thể đặt trong sự kiện 'DataBound'. 'grid.DataBound + = (s, e) => {grid.HeaderRow.TableSection = TableRowSection.TableHeader; }; ' – BrunoLM

+4

Không biết nếu điều này là khác nhau trong .NET 4.5 bây giờ ... nhưng tôi nhận được HeaderRow được null trong cả hai xử lý sự kiện _DataBound và _PreRender. Điều này có thể liên quan đến thực tế tôi đang sử dụng ASP.NET Web Forms mới "Model Binding" tính năng trong GridView. – ClearCloud8

2

Tạo một chức năng và sử dụng chức năng rằng trong trường hợp PageLoad của bạn như thế này:

Chức năng là:

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

Sự kiện PageLoad là:

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

tôi sử dụng đoạn mã sau để làm điều này:

Các báo cáotôi đã thêm là quan trọng.

Nếu không (tùy thuộc vào cách bạn làm cho mạng lưới của bạn), bạn sẽ ném ngoại lệ như:

Bảng phải chứa phần hàng theo thứ tự tiêu đề, cơ thể và sau đó Footer.

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); 
} 

Đối tượng this là GridView của tôi.

Tôi thực sự overrode GridView Asp.net để thực hiện kiểm soát tùy chỉnh của riêng tôi, nhưng bạn có thể dán điều này vào trang aspx.cs và tham khảo GridView theo tên thay vì sử dụng phương pháp tiếp cận xem lưới tùy chỉnh.

FYI: Tôi chưa thử nghiệm logic chân trang, nhưng tôi biết điều này phù hợp với Tiêu đề.

3

này làm việc cho tôi:

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; 
    } 
} 

này đã được thử nghiệm trong VS2010.

14

tôi sử dụng này trong OnRowDataBound sự kiện:

if (e.Row.RowType == DataControlRowType.Header) 
    e.Row.TableSection = TableRowSection.TableHeader; 
+4

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Ai thiết kế những điều khiển khủng khiếp này? – EKW

+0

Tôi đã chèn mã của bạn vào sự kiện OnRowCreated và làm cho nó hoạt động chính xác. – yougotiger

1

Tôi biết điều này là cũ, nhưng, đây là một giải thích câu trả lời MikeTeeVee của, đối với một GridView tiêu chuẩn:

trang 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; 
     } 

    }