ฉันจะทำให้ Gridview แสดง THEAD ได้อย่างไร


112

ฉันจะGridViewควบคุมการแสดงผล<thead> <tbody>แท็กได้อย่างไร ฉันรู้ว่า.UseAccessibleHeadersทำให้มันถูกใส่<th>แทน<td>แต่ฉันไม่<thead>สามารถปรากฏให้เห็นได้


FYI: UseAccessibleHeader เป็น "จริง" ตามค่าเริ่มต้นดังนั้นคุณไม่จำเป็นต้องตั้งค่า msdn.microsoft.com/en-us/library/…
MikeTeeVee

คำตอบ:


187

สิ่งนี้ควรทำ:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRowคุณสมบัติจะnullจนGridViewได้รับข้อมูลที่ถูกผูกเพื่อให้แน่ใจว่าจะรอจนกว่า databinding ได้เกิดขึ้นก่อนที่จะใช้เส้นข้างต้นของรหัส
bdukes

6
ตามความคิดเห็นด้านล่างด้วย ASP.NET 4.5 อย่างน้อยหลังจากการผูกยังไม่ล่าช้าพอ - ทำงานใน OnPreRender อย่างไรก็ตาม
philw

ฉันมี gridview ที่เพิ่มส่วนหัวย่อยที่กำหนดเอง แต่ละส่วนหัวย่อยเหล่านี้จะแสดงข้อมูลจากแหล่งข้อมูล เหตุผลที่ฉันต้องการเรนเดอร์theadคือใช้ใน jQuery อย่างไรก็ตามหลังจากแสดงส่วนหัวแล้วtbodyดูเหมือนว่าจะไม่สามารถใช้งานได้ สิ่งที่อาจขาดหายไปในกรณีของฉัน?
bonCodigo

1
ฉันพบว่ายังมีปัญหาในระหว่างการโพสต์แบ็คและวางโค้ดไว้ในเหตุการณ์ฐานข้อมูลซึ่งจัดการกับสถานการณ์ทั้งหมด
James Westgate

ฉันนำข้อมูลของฉันจากฐานข้อมูลเมื่อผู้ใช้คลิกที่ปุ่ม ในกรณีนี้ gridview ไม่มีแท็กโฆษณา ความช่วยเหลือใด ๆ
touinta

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

นี่เป็นทางออกที่ดีที่สุดเนื่องจากจะขจัดความเสี่ยง (และการตรวจสอบที่จำเป็น) ของ TableSection ที่เป็นโมฆะหากไม่มีแถวอยู่ในแหล่งข้อมูล
EvilDr

1
Fyi ถ้าGridViewอยู่ภายในUpdatePanelและ async-postback เกิดจากการควบคุมอื่น ๆOnRowDataBoundเหตุการณ์จะไม่ถูกยกขึ้นดังนั้นโค้ดในคำตอบนี้จะไม่ถูกดำเนินการส่งผลให้GridViewเปลี่ยนกลับเป็นการแสดงผลโดยไม่มี<thead>แท็ก ... ถอนหายใจ . หากต้องการกำหนดเป้าหมายกรณีนี้ให้ใส่รหัสจากคำตอบที่ยอมรับลงในPreRenderตัวจัดการเหตุการณ์ของ gridView (เหมือนกับคำตอบของ ASalvo ที่แนะนำ)
Mr.Z

นี่คือคำตอบที่ถูกต้องเนื่องจากใช้เวิร์กโฟลว์ WebForms อย่างถูกต้อง
Marcel

10

รหัสในคำตอบที่ต้องการที่จะไปหรือPage_Load GridView_PreRenderฉันวางไว้ในวิธีการที่เรียกว่าหลังจากนั้นPage_Loadและได้รับไฟล์NullReferenceException.


4
คุณยังสามารถใส่ในDataBoundเหตุการณ์ grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM

4
ไม่ทราบว่าสิ่งนี้แตกต่างกันหรือไม่ใน. NET 4.5 ตอนนี้ ... แต่ฉันได้รับ HeaderRow เป็นโมฆะในตัวจัดการเหตุการณ์ทั้ง _DataBound และ _PreRender สิ่งนี้อาจเกี่ยวข้องกับการที่ฉันใช้ ASP.NET Web Forms คุณลักษณะ "Model Binding" ใหม่ใน gridView
ClearCloud8

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 ตามชื่อแทนการใช้วิธีการกำหนดตารางมุมมองที่กำหนดเอง

FYI: ฉันยังไม่ได้ทดสอบตรรกะส่วนท้าย แต่ฉันรู้ว่ามันใช้ได้กับส่วนหัว


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

ฉันรู้ว่ามันเก่า แต่นี่คือการตีความคำตอบของ 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;
        }

    }

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

0

คุณยังสามารถใช้ jQuery เพื่อเพิ่มได้ สิ่งนี้หลีกเลี่ยงปัญหาเกี่ยวกับ TableRowSection.TableHeader ที่ถูกทิ้งบน PostBack

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.