Создание панели с изображениями и кнопкой ссылки во время выполнения - PullRequest
2 голосов
/ 14 июля 2010

У меня есть мастер-страница с Treeview.Вы можете выбрать несколько узлов там.Основываясь на выборе, вы получаете некоторые элементы в Placeholder Default.aspx, вы получаете изображение и кнопку ссылки, помещенную в Panel.Например:

альтернативный текст http://a.imageshack.us/img20/9206/foldersrb.jpg

Этот код находится в Default.aspx с мастер-страницей.

        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» в древовидной структуре, я получаю результаты на изображении выше.Допустим, я затем нажимаю «Панк-пантера» и получаю сообщение об ошибке.

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

Кроме того, как бы я поступил, сделав обработчик событий для кнопки ссылки во время выполнения, можетя делаю один обработчик событий, который использует каждая кнопка ссылки или что?Я хочу, чтобы папка и кнопка ссылки были кликабельными и ссылались на одно и то же место. Проще ли сделать всю панель кликабельной, если да, как я могу получить на ней событие «OnClick»?

1 Ответ

1 голос
/ 23 июля 2010

Ваша проблема связана с иногда трудным для понимания 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 ...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...