THEAD'yi işlemek için Gridview'i nasıl edinebilirim?


Yanıtlar:


187

Bunu yapmalı:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRowMülkiyet olacak nullkadar GridViewveri bağlı olmuştur böylece veri bağlama kod yukarıdaki satırı çalıştırmadan önce oluştu kadar beklemek emin olun.
bdukes

6
Aşağıda yorumlandığı gibi, ASP.NET 4.5 ile en azından bağlama sonrası yeterince geç değildir - ancak OnPreRender'da çalışır.
philw

Özel alt başlıkları eklenmiş bir ızgara görünümüm var. Bu alt başlıkların her biri, veri kaynağından gelen verileri gösterir. Oluşturmak istememin nedeni thead, onu jQuery'de kullanmaktır. Ancak üstbilgiyi oluşturduktan sonra tbodymevcut görünmüyor. Benim durumumda eksik olan ne olabilir?
bonCodigo

1
Geri gönderme sırasında hala sorunlar olduğunu fark ettim ve kodu tüm senaryoları ele alan veri bağlantılı olaya yerleştirdim.
James Westgate

Kullanıcı bir düğmeyi tıkladığında verilerimi bir veritabanından getiriyorum. Bu durumda ızgara görünümünde thead etiketi eksiktir. Herhangi bir yardım?
touinta

25

Bunu OnRowDataBoundolayda kullanıyorum:

protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
    if (e.Row.RowType == DataControlRowType.Header) {
        e.Row.TableSection = TableRowSection.TableHeader;
    }
}

7
Benim için işe yarayan tek çözüm bu. Bu korkunç kontrolleri kim tasarladı?
EKW

2
Kodunuzu OnRowCreated olayına ekledim ve düzgün çalışmasını sağladım.
yougotiger

Bu en iyi çözümdür, çünkü DataSource içinde satır yoksa TableSection'ın boş olma riskini (ve gerekli kontrolü) ortadan kaldırır.
EvilDr

1
Bilginize, eğer GridViewbir içindeyse UpdatePanelve eşzamansız bir geri gönderme başka bir denetimden kaynaklanıyorsa, bu OnRowDataBounddurumda olay yükseltilmeyecek, bu nedenle bu yanıttaki kod çalıştırılmayacak, bu GridViewda <thead>etiketler olmadan oluşturmaya geri dönülmesine neden olacak ... ah . Bu durumu hedeflemek için , kabul edilen yanıttan kodu gridView PreRenderolay işleyicisine taşıyın ( ASalvo'nun yanıtının önerdiği gibi).
Bay Z

WebForms iş akışını doğru bir şekilde kullandığı için bu doğru yanıttır.
Marcel

10

Cevaptaki kodun Page_Loadveya devam etmesi gerekiyor GridView_PreRender. Sonra çağrılan bir yönteme koydum Page_Loadve bir NullReferenceException.


4
Ayrıca DataBoundetkinlik de koyabilirsiniz . grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM

4
Şu anda .NET 4.5'te farklı olup olmadığını bilmiyorum ... ancak HeaderRow'un hem _DataBound hem de _PreRender olay işleyicilerinde boş olduğunu alıyorum. Bu, gridView'daki ASP.NET Web Forms yeni "Model Bağlama" özelliğini kullandığım gerçeğiyle ilgili olabilir.
ClearCloud8

7

Bunu yapmak için aşağıdaki kodu kullanıyorum:

ifBen ekledi ifadeleri önemlidir.

Aksi takdirde (ızgaranızı nasıl oluşturduğunuza bağlı olarak) aşağıdaki gibi istisnalar atarsınız:

Tablo, başlık, gövde ve ardından altbilgi sırasıyla satır bölümleri içermelidir.

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

thisNesne benim GridView olduğunu.

Aslında kendi özel denetimimi yapmak için Asp.net GridView'u geçersiz kıldım , ancak bunu aspx.cs sayfanıza yapıştırabilir ve özel gridview yaklaşımını kullanmak yerine GridView'a adıyla başvurabilirsiniz .

Bilginize: Altbilgi mantığını test etmedim, ancak bunun Başlıklar için işe yaradığını biliyorum.


5

Bu benim için çalışıyor:

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

Bu VS2010'da denendi.


2

Bunun eski olduğunu biliyorum, ancak standart bir kılavuz görünümü için MikeTeeVee'nin cevabının bir yorumu:

aspx sayfası:

<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

Bir işlev oluşturun ve bu işlevi PageLoadetkinliğinizde şu şekilde kullanın:

İşlev şudur:

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

PageLoadOlaydır:

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

0

Eklemek için jQuery'yi de kullanabilirsiniz. Bu, PostBack'e bırakılan TableRowSection.TableHeader ile ilgili sorunu önler.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.