Gridview Сортировка и разбиение на страницы с динамически генерируемыми элементами управления - PullRequest
3 голосов
/ 17 мая 2011

Я впал в рассол с использованием динамических элементов управления в 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();
}

Ответы [ 4 ]

1 голос
/ 19 мая 2011

Ну, ответом для меня было переосмыслить, как я атаковал проблему. Я избавился от динамической кнопки ссылки и добавил вместо нее поле кнопки. Таким образом, я мог связать вид сетки где угодно, и его состояние управления не имело значения. Вот страница, которая помогла мне.

http://msdn.microsoft.com/en-us/library/bb907626.aspx

0 голосов
/ 17 мая 2011

Вам необходимо использовать событие OnRowCreated GridView для добавления динамических элементов управления, чтобы иметь возможность обрабатывать их состояние. Событие OnRowCreated запускается автоматически при каждой обратной передаче перед загрузкой страницы и каждый раз, когда вы вызываете метод DataBind() в сетке.

Только фактическая привязка данных должна быть в событии OnRowDatabound.

Вы также не должны перепривязывать свою сетку каждый постбэк.

0 голосов
/ 17 мая 2011

Ваша ошибка в том, что вы должны удалить эти две строки из Page_Load ():

grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();

Когда я динамически связываю источник данных с моим контролем, я должен переопределить OnInit следующим образом, взять две строки и поместить их туда:

protected override void OnInit(EventArgs e) {
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
   base.OnInit(e);
}

Затем он поддерживает состояния, потому что это до инициализации ViewState страницы. Как сказал Томас, взгляните на ссылки, которые он вам дал.

Примечание: извините за мой английский, я из Квебека и обычно говорю по-французски.

0 голосов
/ 17 мая 2011

Вы должны написать свой код в PreRender событии страницы
Обзор жизненного цикла страницы ASP.NET
Событие PreRender возникает после того, как объект Page создал все элементы управления, необходимые для отображения страницы, включая дочерние элементы составных элементов управления.

...