グリッドビューで動的コントロールを使用することで、ピクルスに陥りました。
グリッドビューをリストにバインドしてから、動的コントロールを追加しています。コントロールの状態を維持するには、ページの読み込み時にこれを行う必要があります。ただし、ページの読み込み後にイベントが発生するため、並べ替えとページングのイベントを適切に処理できません。この問題に対する創造的な解決策はありますか、それとも私はこれについてすべて間違っていますか?
編集:私は自分の問題を正しく説明したかどうかわかりません。動的コントロールをライフ サイクルのどこに追加するかは問題ではありません。問題は、並べ替えとページングのイベントで GridView を再バインドする必要があることです。これにより、(明らかに) 動的コントロールに割り当てられたプロパティが ViewState から失われます。これは、並べ替えとページングのバインドがライフ サイクルの後半で発生するためです。
protected void Page_Load(object sender, EventArgs e)
{
//NOTE: to maintain control state of dynamic controls all databinding needs to be done in page load.
grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();
}
protected void grdProducts_OnRowDatabound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow) return;
ManufacturerProduct m = new ManufacturerProduct();
m.Model = DataBinder.Eval(e.Row.DataItem, "Model").ToString();
PlaceHolder ph = new PlaceHolder();
ph = (PlaceHolder)e.Row.FindControl("phAddToCart");
LinkButton lb = new LinkButton();
lb.Text = "Add To Cart";
//NOTE: if I bind after page load the command never fires.
lb.Command += new CommandEventHandler(AddItem);
lb.CommandName = "AddItem";
lb.CommandArgument = m.Model;
ph.Controls.Add(lb);
}
protected void grdProducts_OnSorting(object sender, GridViewSortEventArgs e)
{
//NOTE: since events fire after page load I can't handle this properly.
hfSortExpression.Value = e.SortExpression.ToString();
grdProducts.PageIndex = 0;
//NOTE: If I rebind here I hose my dynamic controls
//grdProducts.DataSource = GetDataSource();
//grdProducts.DataBind();
}