目標:グリッド内の各行に対して、グリッド内のすべての列にまたがる行をその下にレンダリングします。
理由:その行にグリッドをネストしたり、クイック編集用のフォームや更新パネルをネストしたりできるようにするためです。
課題: RowDataBound では、RowCreated で作業している行がまだルート テーブルに追加されていません。これにより、その行の前に行を追加したい場合に、e.row.parent コントロールをテーブルとしてキャストして行を追加することが容易になります。これを行うと、作業中の現在の行の前に表示されます。
例:
protected void Page_Load(object sender, EventArgs e)
{
List<String> strings = new List<string>();
strings.Add("Test1");
strings.Add("Test2");
strings.Add("Test3");
CustomGridView GridView1 = new CustomGridView();
GridView1.DataSource = strings.Select(s => new { Column1 = s });
GridView1.DataBind();
phGrid.Controls.Add(GridView1);
}
public class CustomGridView : GridView
{
public Table Table
{
get;
set;
}
public CustomGridView()
{
this.RowCreated += new GridViewRowEventHandler(CustomGridView_RowCreated);
}
protected override Table CreateChildTable()
{
Table = base.CreateChildTable();
return Table;
}
GridViewRow lastRow;
void CustomGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer)
{
if (lastRow != null)
this.Table.Rows.Add(CreateRow());
lastRow = e.Row;
}
}
private static GridViewRow CreateRow()
{
GridViewRow newRow = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Normal);
TableCell cell = new TableCell();
cell.Controls.Add(new LiteralControl(" FormRow"));
newRow.Cells.Add(cell);
return newRow;
}
}
問題点:コードスメルは、このコードで私が望むよりも少し多めです。最後のデータ行を追跡する必要があるのは好きではありません。なぜなら、若い開発者がメンテナンスのためにこのコードの反復的な性質を理解するのは難しいからです。
質問:行が作成された直後に何が呼び出されるか知っている人はいますか? 行が実際にルート テーブルに追加されるのはいつですか。その行に参加するメソッドをオーバーライドできますか。Reflector を使用して GridView クラスを逆コンパイルしましたが、探しているものが見つからないだけです。