Aggiunto in modo dinamico UserControl scompare quando faccio clic su di esso

Ho dei controlli all’interno di un UpdatePanel come questo

   Step 1 (Choose a Widget to Manage)

Quando un elemento è selezionato, aggiungerà un nuovo UserControl a WidgetAdminControls WidgetAdminControls.Controls.Add(widget);

Tuttavia, quando faccio clic sul controllo scompare, presumo perché la pagina viene ricostruita o somehting e non conosce l’UserControl aggiunto in modo dinamico.

Come posso risolvere questo problema?

Sei corretto, la pagina viene ricostruita, quindi devi ricreare l’albero di controllo con ogni postback parziale o completo.

Per fare ciò, è necessario rendere la pagina dichiarativa o includere informazioni sufficienti per ricreare l’albero di controllo ad ogni roundtrip. Ogni approccio ha i suoi vantaggi / svantaggi.

Stateful

Molto probabilmente una pagina stateful utilizzerà Session; bisogna fare attenzione a non scaricare troppo dati in Session e a ripulire correttamente (di solito uso un manager per avvolgere Session e gestire quanti oggetti attivi un utente può avere contemporaneamente). Il vantaggio è che la sessione (anche fuori processo) è molto veloce e sicura.

Andata e ritorno

Questo approccio utilizza ViewState, campi nascosti o informazioni nell’URL. Se l’informazione è inclusa nella pagina, dovrebbe essere misurata in byte , cioè dovrebbe essere estremamente piccola. Inoltre, non è immune da manomissioni.

Il vantaggio è che non devi fare molto per farlo funzionare, e non è necessario un processo di disposizione per la pulizia.

Banca dati

In alternativa, è ansible mantenere le modifiche su un database ad ogni clic e ribuild l’albero dal database, ma di solito non sono un fan di questo approccio a meno che il clic non rappresenti un evento molto significativo e i dati siano completi e convalidati.

Esempio molto semplice

Ecco un esempio che mostra l’uso di Session per mantenere un albero di controllo. Questo dovrebbe funzionare ma non tiene conto di molte cose, come l’apertura di un’altra copia della stessa pagina nella stessa sessione. La gestione degli alberi di controllo può diventare piuttosto complessa.

 private List _listOfStrings { get { return (List)Session["_listOfStrings"]; } set { Session["values"] = value; } } protected override OnInit( EventArgs e ) { if( !Page.IsPostback ) { _listOfStrings = new List(); } 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 } 

I controlli aggiunti dynamicmente devono essere istanziati e inizializzati su ogni postback. Quindi in questo caso devi caricare quel controllo in page_init / load event.