personalizzato usercontrol contenuto in UpdatePanel scompare sul pulsante fare clic su postback
-
13-12-2019 - |
Domanda
Ho la seguente funzione che aggiorna l'UpdatePanel contenuto con l'aggiunta di/caricamento di un ascx usercontrol personalizzato nel segnaposto che è in default.aspx:
protected void NavigationTab_Click(string ascxpath)
{
Control ctrl = LoadControl(ascxpath);
//cphmaincontent is my asp ContenPlaceHoderId in masterpage
PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent");
phmaincontent.Controls.Clear();
phmaincontent.Controls.Add(ctrl);
upmaincontent.Update();
}
Masterpage UpdatePanel:
<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lbmsg" runat="server" Text=""></asp:Label>
<asp:ContentPlaceHolder ID="cphmaincontent" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
Sto chiamando NavigationTab_Click dal mio controllo di navigazione che è un'altra usanza ascx di controllo, il mio ctrl oggetto di Controllo che è il caricamento in modo dinamico e ognuno ha il pulsante e l'etichetta quando faccio clic sul pulsante semplicemente riassegna un po ' di testo per l'etichetta.
e ho il seguente codice sul mio masterpage solo per ottenere il controllo ascx percorso:
protected override void OnInit(EventArgs e)
{
//raising an event to set ascx path
mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click);
base.OnInit(e);
}
finora tutto funziona bene, dopo aver caricato il mio ctrl oggetto chiamando NavigationTab_Click funzione vedo il mio ctrl nel segnaposto e ha il bottone e l'etichetta, ma il problema è questo se faccio clic su questo pulsante dovrebbe riassegnare l'etichetta di testo, ma invece tutto il ctrl controllare il contenuto scompare, si prega di aiuto.
Soluzione
Quando hai aggiunta di controlli dinamicamente è necessario assicurarsi che si ottiene ricreato ogni postback.È inoltre necessario assicurarsi che è possibile assegnare lo stesso ID di prima, altrimenti eventi non verrà attivato correttamente e valori non possono essere ricaricati dal ViewState.Questo deve essere fatto Page_Load(si meglio nel Page_Init).
Che è il motivo per cui si dovrebbe evitare di controlli dinamici ogni volta che è possibile.
Quindi, è possibile aggiungere controlli in caso di gestori come hai fatto.Ma devono essere ricreato al successivo Postback.Quindi, avete bisogno di memorizzare da qualche parte che(f.e.Id) o quanti controlli sono già stati creati.Che può essere fatto, ad esempio, in ViewState
o Session
.Quindi è possibile assegnare un'adeguata Id per i controlli(per esempio con l'indice o l'ID suffisso).
Qui ci sono alcune altre informazioni su questo argomento: