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?
Trả lời
này nên làm điều đó:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
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
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
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
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
.
Bạn cũng có thể đặt trong sự kiện 'DataBound'. 'grid.DataBound + = (s, e) => {grid.HeaderRow.TableSection = TableRowSection.TableHeader; }; ' – BrunoLM
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
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);
}
}
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 đề.
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.
tôi sử dụng này trong OnRowDataBound
sự kiện:
if (e.Row.RowType == DataControlRowType.Header)
e.Row.TableSection = TableRowSection.TableHeader;
Đâ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
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
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;
}
}
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