タグGridView
をレンダリングするためのコントロールを取得するにはどうすればよい<thead>
<tbody>
ですか?私.UseAccessibleHeaders
はそれをの<th>
代わりに置くことを知ってい<td>
ますが、<thead>
を表示させることができません。
タグGridView
をレンダリングするためのコントロールを取得するにはどうすればよい<thead>
<tbody>
ですか?私.UseAccessibleHeaders
はそれをの<th>
代わりに置くことを知ってい<td>
ますが、<thead>
を表示させることができません。
回答:
これはそれを行うはずです:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
プロパティは次のようになりますnull
まで、GridView
データがバインドされていますので、データバインディングは、上記のコード行を実行する前に発生したまで待機することを確認してください。
thead
は、jQueryで使用するためです。ただし、ヘッダーをレンダリングした後、tbody
は使用できないようです。私の場合、何が欠けているのでしょうか?
私はこれをOnRowDataBound
イベントで使用します:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
が内にUpdatePanel
あり、非同期ポストバックが他のコントロールによって引き起こされている場合、OnRowDataBound
イベントは発生しないため、この回答のコードは実行されGridView
ず、<thead>
タグなしのレンダリングに戻ります... ため息。このケースを対象とするには、受け入れられた回答からgridViewのPreRender
イベントハンドラーにコードを押し込みます(ASalvoの回答が示唆するように)。
回答のコードは、Page_Load
またはに進む必要がありますGridView_PreRender
。後で呼び出されるメソッドに入れてPage_Load
を取得しましたNullReferenceException
。
DataBound
イベントに入れることもできます。grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
これを行うには、次のコードを使用します。
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を参照することもできます。
参考までに、私はフッターロジックをテストしていませんが、これがヘッダーで機能することはわかっています。
これは私にとってはうまくいきます:
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で試されました。
関数を作成し、次の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);
}
}
私はこれが古いことを知っていますが、標準のグリッドビューに対する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;
}
}