2012-01-20 2 views
0

у меня есть элементы управления внутри UpdatePanel как этотДинамически Добавлено UserControl исчезает, когда я нажимаю на него

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     Step 1 (Choose a Widget to Manage)<br /> 
     <asp:DropDownList ID="DropDownWidgetSelection" runat="server" 
      OnSelectedIndexChanged="DropDownWidgetSelection_SelectedIndexChanged" 
      AutoPostBack="True"> 
     </asp:DropDownList> 
     <div id="WidgetAdminControls" runat="server"></div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

При выборе товара, он будет добавлен новый UserControl в WidgetAdminControls WidgetAdminControls.Controls.Add(widget);

Однако, когда Я нажимаю на элемент управления, который исчезает, я полагаю, потому что страница перестроена или зашифрована, и она не знает о динамически добавленном UserControl.

Как исправить эту проблему?

ответ

2

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

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

Stateful

Скорее всего Stateful страница будет использовать Session; необходимо принять меры, чтобы не сбрасывать слишком много данных в сеанс и правильно очищать (я обычно использую диспетчер для переноса сеанса и управления количеством активных объектов, которые пользователь может иметь сразу). Поверхность заключается в том, что сеанс (даже вне процесса) очень быстрый и безопасный.

Roundtrip

Этот подход использует ViewState, скрытые поля или информацию в URL. Если информация включена в страницу, она должна быть измерена в байт, то есть она должна быть крайне мала. Он также невосприимчив к подделке.

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

Database

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

очень простой пример

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

private List<string> _listOfStrings 
{ 
    get 
    { 
    return (List<string>)Session["_listOfStrings"]; 
    } 
    set 
    { 
    Session["values"] = value; 
    } 
} 

protected override OnInit(EventArgs e) 
{ 
    if(!Page.IsPostback) 
    { 
     _listOfStrings = new List<string>(); 
    } 

    BuildControlTree(); 
} 

private void BuildControlTree() 
{ 
    foreach(string s in _listOfStrings) 
    { 
    // add a control to the control tree 
    } 
} 

protected void btnAddItem_Click(object sender, EventArgs e) 
{ 
    _listOfStrings.Add("some new item"); 

    // insert the control into the tree 
} 
+0

Можете ли вы привести пример того, как я могу это сделать? – jax

+0

@jax - Я обновил свой ответ несколькими вариантами и образцом. Управление деревьями в веб-формах сопряжено с трудностями; Я написал целую библиотеку, чтобы абстрагировать процесс и не забывать писать «сантехнический» код снова и снова, чтобы управлять им. –

0

Dynamically добавленные элементы управления должны быть созданы и инициализированы на каждой обратной передаче. Поэтому в этом случае вам нужно загрузить этот элемент управления в событие page_init/load.

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