Ваша проблема связана с иногда трудным для понимания ASP.NET Page Lifecycle .
Иерархия управления, которую вы создаете во время выполнения , не воссоздается в правильной точке жизненного цикла страницы во время запроса обратной передачи, если она вообще есть.
«Классический» подход, используемый другими веб-элементами управления (например, DataGrid) для решения этой проблемы, заключается в сериализации данных, загруженных в них, в представление состояния, чтобы при обратной передаче иерархия элементов управления могла быть восстановлена только из значений обратной передачи (без необходимости запросить базу данных еще раз). Однако реализация такого подхода может быть неуместной в ваших обстоятельствах.
Вместо этого вы можете создать массив (или другое сериализуемое перечисление) из item
значений ключей (item.Nav_ID
), которые использовались для построения предыдущей иерархии элементов управления, и добавить это в viewstate, например:
List<Int32> navIdValues = new List<Int32>();
foreach (var item in query)
{
navIdValues.Add(item.Nav_ID);
}
Page.ViewState("NavIdValues") = navIdValues
Затем, во время события Page.Init
входящей обратной передачи, получите значения, которые вы использовали для построения иерархии элементов управления в предыдущем запросе:
List<Int32> navIdValues = Page.ViewState("NavIdValues") as List<Int32>;
Повторно выполнить ваш запрос, создав словарь элементов, доступных по Nav_ID
:
IDictionary<Int32, ??itemtype??> items = query.ToDictionary(n => n.Nav_Id);
А затем пересоберите иерархию управления, существовавшую в предыдущем запросе:
foreach (Int32 navId in navIdValues)
{
var item = items(navId);
Panel div = new Panel();
div.ID = item.Nav_ID.ToString();
div.CssClass = "BulletDiv";
... etc ...
}
Тогда ваше событие обратной передачи должно сработать, как и ожидалось, поскольку иерархия элементов управления была воссоздана до обработки события обратной передачи. Возможно, это не самое оптимальное решение, но оно является работоспособным.