Jak uzyskać GridView
kontrolę nad renderowaniem <thead>
<tbody>
tagów? Wiem .UseAccessibleHeaders
, że <th>
zamiast tego wstawia <td>
, ale nie mogę się <thead>
pojawić.
Jak uzyskać GridView
kontrolę nad renderowaniem <thead>
<tbody>
tagów? Wiem .UseAccessibleHeaders
, że <th>
zamiast tego wstawia <td>
, ale nie mogę się <thead>
pojawić.
Odpowiedzi:
To powinno wystarczyć:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
Nieruchomość będzie null
aż GridView
zostały dane związane, więc upewnij się, aby poczekać do wiązania z danymi nastąpiło przed wykonaniem powyższej linii kodu.
thead
jest użycie go w jQuery. Jednak po wyrenderowaniu nagłówka tbody
plik nie wydaje się być dostępny. Czego może brakować w moim przypadku?
Używam tego w OnRowDataBound
przypadku:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
znajduje się w obrębie an UpdatePanel
i postback asynchroniczny jest spowodowany przez jakąś inną kontrolkę, to OnRowDataBound
zdarzenie nie zostanie zgłoszone, więc kod w tej odpowiedzi nie zostanie wykonany, co spowoduje GridView
powrót do renderowania bez <thead>
tagów ... westchnij . Aby wskazać ten przypadek, wepchnij kod z zaakceptowanej odpowiedzi do programu PreRender
obsługi zdarzeń gridView (podobnie jak sugeruje odpowiedź ASalvo ).
Kod w odpowiedzi musi trwać dalej Page_Load
lub GridView_PreRender
. Umieściłem to w metodzie, która została wywołana później Page_Load
i otrzymałem NullReferenceException
.
DataBound
wydarzeniu. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
Aby to zrobić, używam następującego kodu:
Do if
stwierdzenia, że dodawane są ważne.
W przeciwnym razie (w zależności od tego, jak renderujesz swoją siatkę), będziesz rzucać wyjątki, takie jak:
Tabela musi zawierać sekcje wierszy w kolejności nagłówka, treści i stopki.
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
Obiekt jest moim GridView.
W rzeczywistości przesłoniłem widok GridView Asp.net, aby utworzyć własną niestandardową kontrolkę, ale możesz wkleić ją na stronie aspx.cs i odwołać się do GridView według nazwy, zamiast używać podejścia niestandardowego widoku siatki .
FYI: Nie testowałem logiki stopki, ale wiem, że to działa w przypadku nagłówków.
To działa dla mnie:
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;
}
}
Próbowano tego w VS2010.
Wiem, że to jest stare, ale oto interpretacja odpowiedzi Mike'aTeeVee dla standardowego widoku siatki:
strona 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;
}
}
Utwórz funkcję i użyj tej funkcji w swoim PageLoad
wydarzeniu w następujący sposób:
Funkcja to:
private void MakeGridViewPrinterFriendly(GridView gridView) {
if (gridView.Rows.Count > 0) {
gridView.UseAccessibleHeader = true;
gridView.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}
PageLoad
Wydarzenie jest:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}