Динамически добавленный UserControl исчезает, когда я нажимаю на него - PullRequest
0 голосов
/ 20 января 2012

У меня есть элементы управления внутри UpdatePanel, как это

<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 ]

2 голосов
/ 20 января 2012

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

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

Stateful

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

Roundtrip

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

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

База данных

В качестве альтернативы, вы можете сохранять свои изменения в базе данных с каждым щелчком мыши и перестраивать дерево из базы данных, но я обычно не сторонник этого подхода, если только щелчок не представляет очень важное событие, а данные полны и ПРОВЕРЯЕМЫЕ.

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

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

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 голосов
/ 20 января 2012

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

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