Могу ли я явно заставить asp.NET повторно загрузить данные ViewState любого элемента управления данными?
У меня есть проблема, касающаяся иерархии asp.net lifecylce.
По сути, у меня есть один пользовательский элемент управления, в котором есть GridView. И этот GridView генерируется динамически на основе открытого свойства элемента управления (имя параметра в упрощенном коде ниже).
Все нормально, когда я вставляю этот элемент управления на страницу aspx, устанавливаю его свойство Parameter и вызываю DataBind(Parameter) для него. GridView генерируется и заполняется в пользовательском интерфейсе.
Проблема возникает, когда я отправляю обратно страницу. Я должен восстановить структуру GridView, чтобы данные в ViewState элемента управления могли использоваться для заполнения GridView. Так что я могу добиться его содержания. Но пока структура GridView генерируется динамически и основана на установленном для нее свойстве Parameter, это невозможно. Потому что OnInit пользовательского элемента управления вызывается перед OnInit страницы, и поэтому свойство Parameter устанавливается после генерации структуры GridView. В результате я получаю пустой Gridview в конце.
Вот код в упрощенном виде.
Можете ли вы дать мне несколько рекомендаций, как это преодолеть?
Могу ли я явно заставить asp.NET повторно загрузить ViewState вида gridView?
Страница HomePage.aspx имеет обработчик события OnInit таким образом, что она устанавливает свойство пользовательского элемента управления ctlMyUSerControl
protected override void OnInit(EventArgs e)
{
ctlMyUserControl.Parameter = new Parameter()
name="Orhan",
surname= "Pamuk"};
}
И в OnInit ctlMyUserControl у меня есть
protected override void OnInit(EventArgs e)
{
if (Page.IsPostBack && Parameter !=null && SomeGridViewRowsExistOnUI)
{
// Generate dynamic columns based on Parameter property
// So that gridview can be populated
// with the post-backed data which
// should contain the ViewState of the gridview
GenerateGridViewColumns(Parameter);
}
base.OnInit(e);
}
1 ответ
Я продал это, ребята.
Я регенерировал мои столбцы GridView на странице контейнера пользовательского элемента управления.
Итак, в OnInit страницы я регенерирую свои столбцы, и это все еще до вызова метода LoadViewState().
protected override void OnInit(EventArgs e)
{
Parameter parameter = new Parameter()
name="Orhan",
surname= "Pamuk"};
ctlMyUserControl.GenerateGridViewColumns(parameter);
}