Я впал в рассол с использованием динамических элементов управления в gridivew.
Я связываю вид сетки со списком, а затем добавляю элементы управления dyanmic. Чтобы сохранить состояние управления, мне нужно сделать это при загрузке страницы. Однако, поскольку события запускаются после загрузки страницы, я не могу правильно обрабатывать события сортировки и подкачки. Есть какие-то творческие решения этой проблемы, или я все об этом не так?
РЕДАКТИРОВАТЬ: Я не уверен, что я правильно объяснил свою проблему. Неважно, куда я добавляю динамические элементы управления в жизненном цикле. Проблема в том, что события сортировки и подкачки требуют от меня повторной привязки 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();
}