次のような列を持つ ASP.NET GridView があります。
| Foo | Bar | Total1 | Total2 | Total3 |
このような 2 行のヘッダーを作成することはできますか?
| | Totals |
| Foo | Bar | 1 | 2 | 3 |
各行のデータは変更されません。これは、ヘッダーをきれいにして、グリッドが占める水平スペースを減らすためです。
問題が発生した場合に備えて、GridView 全体を並べ替えることができます。追加された「合計」スパン列に並べ替え機能を持たせるつもりはありません。
編集:
以下の記事の 1 つに基づいて、GridView を継承し、2 番目のヘッダー行を追加するクラスを作成しました。
namespace CustomControls
{
public class TwoHeadedGridView : GridView
{
protected Table InnerTable
{
get
{
if (this.HasControls())
{
return (Table)this.Controls[0];
}
return null;
}
}
protected override void OnDataBound(EventArgs e)
{
base.OnDataBound(e);
this.CreateSecondHeader();
}
private void CreateSecondHeader()
{
GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);
TableCell left = new TableHeaderCell();
left.ColumnSpan = 3;
row.Cells.Add(left);
TableCell totals = new TableHeaderCell();
totals.ColumnSpan = this.Columns.Count - 3;
totals.Text = "Totals";
row.Cells.Add(totals);
this.InnerTable.Rows.AddAt(0, row);
}
}
}
私のように ASP.NET を初めて使用する場合は、次のことを行う必要があることも指摘しておきます。
1) Web フォームに次のような行を追加して、クラスを登録します。
<%@ Register TagPrefix="foo" NameSpace="CustomControls" Assembly="__code"%>
2) 前のマークアップの asp:GridView を foo:TwoHeadedGridView に変更します。終了タグを忘れないでください。
別の編集:
カスタム クラスを作成せずにこれを行うこともできます。
次のように、グリッドの DataBound イベントのイベント ハンドラーを追加するだけです。
protected void gvOrganisms_DataBound(object sender, EventArgs e)
{
GridView grid = sender as GridView;
if (grid != null)
{
GridViewRow row = new GridViewRow(0, -1,
DataControlRowType.Header, DataControlRowState.Normal);
TableCell left = new TableHeaderCell();
left.ColumnSpan = 3;
row.Cells.Add(left);
TableCell totals = new TableHeaderCell();
totals.ColumnSpan = grid.Columns.Count - 3;
totals.Text = "Totals";
row.Cells.Add(totals);
Table t = grid.Controls[0] as Table;
if (t != null)
{
t.Rows.AddAt(0, row);
}
}
}
カスタム コントロールの利点は、Web フォームのデザイン ビューで追加のヘッダー行を確認できることです。ただし、イベント ハンドラー メソッドはもう少し単純です。