THEAD को रेंडर करने के लिए मुझे Gridview कैसे मिलेगा?


112

टैग्स GridViewको रेंडर करने के लिए मुझे कैसे कंट्रोल मिलेगा <thead> <tbody>? मुझे पता .UseAccessibleHeadersहै कि <th>इसके बजाय इसे रखा जाता है <td>, लेकिन मुझे <thead>दिखने के लिए नहीं मिल सकता है।


FYI करें: UseAccessibleHeader डिफ़ॉल्ट रूप से "सही" है, इसलिए आपको इसे सेट करने की आवश्यकता नहीं है। msdn.microsoft.com/en-us/library/…
मिकीटेवी

जवाबों:


187

यह करना चाहिए:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRowसंपत्ति हो जाएगा nullजब तक GridViewडेटा बाध्य कर दिया गया है, इसलिए जब तक डेटा बाइंडिंग कोड के ऊपर लाइन चलाने से पहले आ गई है प्रतीक्षा करना सुनिश्चित करें।
bdukes

6
नीचे टिप्पणी के रूप में, ASP.NET 4.5 के साथ बाध्यकारी होने के बाद कम से कम पर्याप्त देर नहीं हुई है - यह हालांकि OnPreRender में काम करता है।
philw

मेरे पास कस्टम उप हेडरों के साथ एक ग्रिडव्यू है। इनमें से प्रत्येक उप हेडर डेटा स्रोत से डेटा दिखाते हैं। जिस कारण से मैं प्रस्तुत करना चाहता था theadवह jQuery में इसका उपयोग करना है। हालांकि हेडर रेंडर करने के बाद tbodyउपलब्ध नहीं लगता है। मेरे मामले में क्या गायब हो सकता है?
bonCodigo 8

1
मैंने पाया कि पोस्टबैक के दौरान अभी भी समस्याएं थीं और डेटबाउंड इवेंट में कोड रखा गया था जो सभी परिदृश्यों को संबोधित करता था।
जेम्स वेस्टगेट

जब एक बटन पर उपयोगकर्ता क्लिक करता है तो मैं अपना डेटा डेटाबेस से लाता हूं। उस स्थिति में ग्रिडव्यू थीड टैग को याद कर रहा है। कोई मदद?
टौंटा

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 के जोखिम (और आवश्यक चेक) को हटा देता है।
एविलड्रर

1
Fyi, अगर एक GridViewके भीतर है UpdatePanelऔर एक async-postback किसी अन्य नियंत्रण के कारण होता है, तो OnRowDataBoundईवेंट को नहीं उठाया जाएगा, इसलिए इस उत्तर में कोड निष्पादित नहीं किया जाएगा, जिसके परिणामस्वरूप टैग के GridViewबिना रेंडर करने के लिए पुन: दावा किया जा रहा है <thead>... आह । इस मामले को लक्षित करने के लिए, कोड को ग्रिडव्यू के इवेंट हैंडलर में स्वीकृत उत्तर से अलग कर दें PreRender(बहुत कुछ असाल्वो के जवाब से पता चलता है)।
मि। १५

यह सही उत्तर है, क्योंकि यह ठीक से WebForms वर्कफ़्लो का उपयोग करता है।
मार्सेल

10

उत्तर में कोड पर Page_Loadया जाने की जरूरत है GridView_PreRender। मैंने इसे एक विधि में रखा, जिसे बाद में बुलाया गया Page_Loadऔर ए मिला NullReferenceException


4
आप DataBoundइवेंट में भी डाल सकते हैं । grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
ब्रूनोएलएम

4
पता नहीं कि क्या यह .NET 4.5 में अब अलग है ... लेकिन मुझे _DataBound और _PreRender ईवेंट हैंडलर दोनों में HeaderRow शून्य है। यह इस तथ्य से संबंधित हो सकता है कि मैं ASP.NET वेब फॉर्म्स का नया "मॉडल बाइंडिंग" फीचर ग्रिड व्यू में उपयोग कर रहा हूं।
क्लियरक्लाउड 8

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 पृष्ठ में पेस्ट कर सकते हैं और कस्टम-ग्रिडव्यू दृष्टिकोण का उपयोग करने के बजाय नाम द्वारा ग्रिड दृश्य का संदर्भ दे सकते हैं।

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

यह वीएस2010 में आजमाया गया था।


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

मुझे पता है कि यह पुराना है, लेकिन, यहां मानक ग्रिडव्यू के लिए माइकटेवी के जवाब की व्याख्या है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.