2009-11-03 3 views
0

Я добавил элемент управления пользователя в PlaceHolder с идентификатором phcustomFields. Когда я хочу удалить пользовательский элемент управления в phcustomFields, я вызываю phcustomFields.Controls.Clear(). Однако, после этого, мой метод page_Load моего usercontrol по-прежнему попадает (я проверял это, поставив точку останова в пользовательском элементе управления.) Почему метод page_load моего пользовательского элемента все еще называется? Я думал, что экземпляр моего пользовательского элемента управления был удален и уничтожен после вызова метода Clear().ASP.NET: как уничтожить динамически добавленный элемент управления пользователя

Update

Ниже приведен пример кода, который демонстрирует мою проблему. Установив точку останова в методе Page_Load HelloWorld.ascx и отлаживая страницу Page.aspx, процесс отладки остановится на методе Page_Load в HelloWorld.ascx, который ожидается и будет прекрасен мной. Но когда я нажимаю кнопку «Удалить HelloWorld.ascx», чтобы удалить элемент управления пользователя, а затем нажмите кнопку «Ничего», чтобы вызвать обратную передачу, процесс отладки STILL останавливается на методе Page_Load HelloWorld.ascx. Однако это не должно происходить, потому что был вызван метод Clear() в phTest.

Page.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page.aspx.cs" Inherits="WebApplication1.Page" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Control C = LoadControl("HelloWorld.ascx"); 
     phTest.Controls.Add(C); 
    } 

    protected void Remove_OnClick(object sender, EventArgs e) 
    { 
     phTest.Controls.Clear(); 
    } 

</script> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:Button Text="Does nothing" runat="server" /> 
     <asp:Button Text="Remove HelloWorld.ascx" OnClick="Remove_OnClick" runat="server" /> 
     <asp:PlaceHolder ID="phTest" Visible="false" runat="server"> 
     </asp:PlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 

HelloWorld.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HelloWorld.ascx.cs" Inherits="WebApplication1.HelloWorld" %> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     int i = 0; 
    } 
</script> 

<b>Hello World</b> 
+0

Можете ли вы показать нам небольшой код? – AnthonyWJones

ответ

0

Clear() определенно удаляет элементы управления из дерева управления и, следовательно, жизненного цикла страницы. Внутри он устанавливает ссылку на элемент управления на null.

Единственный способ, которым это все еще может произойти, - это то, что другой экземпляр этого элемента управления живет где-то еще в дереве управления, или вы не вызываете Clear уже, как вы думаете, или не вызываете его в нужной коллекции. В какой момент жизненного цикла страницы вы вызываете Clear()?

Edit: вы звоните Clear в обработчике Remove_OnClick Эвнет, который долгое время после Page_Load уволила для всех элементов управления. OnLoad будет запускать для страницы и всех элементов управления до того, как она перейдет к следующему событию.

+0

Я обновил свой вопрос, отвечая на ваш вопрос. Я вызываю Clear() на странице_Load. – burnt1ce

+0

@ burnt1ce см. Мое обновление. –

+0

OOPPSSSIEs Thanks – burnt1ce

1

Событие OnClick происходит после события Page_Load в жизненном цикле страницы. При обратном вызове пользователь будет контролировать событие Page_Load. Если вы поместите команду Clear() позже в жизненный цикл родительской страницы, это должно помочь.

EDIT Согласно вашему обновлению. Причина, по которой пользовательский элемент Page_Load происходит каждый раз, состоит в том, что у вас есть код для добавления этого элемента управления к странице в событии Page_Load вашей страницы .aspx. В принципе, каждый раз, когда запрашивается страница, этот пользовательский элемент управления будет добавлен на страницу (и ударит событие пользователя Page_Load).

Если вы хотите, чтобы какое-либо действие произошло или не произошло при обратной передаче, используйте свойство IsPostBack на странице. Не уверен, что именно вы хотите сделать со страницей, но, надеюсь, это немного помогает.

+0

OH глупо меня. Я создал такой глупый пример, я забыл добавить условие if (! IsPostback) вокруг кода, который добавляет пользовательский элемент управления – burnt1ce

0

Вот несколько соответствующих бликов от WebForms жизненного цикла страницы:

  1. события загрузки страницы обрабатывается
  2. Postback событий, в том числе событий щелчка обрабатываются
  3. Страница предварительной визуализации событие обрабатывается

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

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