2010-07-14 3 views
2

У меня есть Masterpage, у которой есть Treeview. Вы можете выбрать там некоторые узлы. Основываясь на выборе, вы получаете некоторые элементы в Placeholder Default.aspx, вы получаете изображение и ссылку, расположенную в панели. Как это:Создание панели с изображениями и кнопкой ссылки во время выполнения

alt text http://a.imageshack.us/img20/9206/foldersrb.jpg

Этот код находится в Default.aspx, который имеет Masterpage.

 TreeView nav_tree = ((TreeView)Master.FindControl("treeview_Navigation")); 
     string selectedNode = nav_tree.SelectedNode.Value; 

     var query = from n in dc.Nemanet_Navigations 
        where n.UserId == userGuid && n.Nav_pID.ToString() == selectedNode && n.Nav_IsFile == false 
        orderby n.Nav_Name 
        select n; 
     foreach (var item in query) 
     { 

      Panel div = new Panel(); 
      div.ID = item.Nav_ID.ToString(); 
      div.CssClass = "BulletDiv"; 
      content_default.Controls.Add(div); 

      Image picture = new Image(); 
      picture.ImageUrl = "~/Icons/New_Folder.png"; 
      div.Controls.Add(picture); 

      div.Controls.Add(new LiteralControl("<br/>")); 

      LinkButton description = new LinkButton(); 
      description.Text = item.Nav_Name; 
      description.PostBackUrl = "default.aspx"; 
      div.Controls.Add(description); 

     } 

Там, кажется, проблема, когда я создаю контроллеры во время выполнения, когда сайт делает постбэк, позволяет сказать, что если я нажимаю «Enska» в TreeView я получить результаты в изображении выше. Позволяет сказать, что я затем нажмите «Панк-пантера», я получаю сообщение об ошибке.

произошла ошибка, потому что управления с идентификатором «ctl00 $ CPH_Main $ ctl05» не могли быть расположены или другой управления назначается одному и тому же ID после обратной передачи. Если идентификатор не присвоен , явным образом задайте свойство элементов управления, которое возвращает события обратной передачи, чтобы избежать этой ошибки.

Кроме того, как бы я мог сделать обработчик события для ссылки в runtime, могу ли я сделать один обработчик событий, который использует каждый элемент ссылки или что? Я хочу, чтобы папка и linkbutton были доступны для просмотра и ссылки на одно и то же место, проще ли сделать панель нажатой, если да, как бы я получил событие OnClick?

ответ

1

Ваша проблема связана с порой трудным для понимания ASP.NET Page Lifecycle.

Управляющая иерархия, созданная во время выполнения , не воссоздается в правильной точке жизненного цикла страницы во время запроса обратной передачи, если вообще существует.

«Классический» подход, который используют другие элементы управления сетью (например, DataGrid) для решения этой проблемы, заключается в сериализации данных, загружаемых в них, в viewstate, так что при обратной передаче иерархия управления может быть восстановлена ​​только из значений обратной передачи (без чтобы снова запросить базу данных). Однако внедрение такого подхода может оказаться неприемлемым в ваших обстоятельствах.

Вместо этого вы можете создать массив (или другую serialisable перечисления) из 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 ... 
} 

Тогда ваше событие postback должно срабатывать, как ожидалось, потому что иерархия управления была воссоздана до обработки события обратной передачи. Это может быть не самое оптимальное решение, но является работоспособным.

Смежные вопросы