Ciao,

ultimamente ho perso un po' di tempo imbattendomi in un comportamento di ASP.NET a cui non riesco a dare una spiegazione.
Ho una pagina che carica un web user control a runtime, inserendolo in un panel.
Il markup della pagina è il seguente:

  
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">  
    <div>  
        Anno   
        <asp:DropDownList ID="ddlAnno" runat="server" AutoPostBack="true">  
        </asp:DropDownList>  
          
        <br />  
          
        <asp:Panel ID="pnlView" runat="server">  
        </asp:Panel>  
    </div>  
</asp:Content>  


Durante il Page_Load() viene eseguito il seguente codice:

  
Dim idAnalysis As Integer = Integer.Parse(ddlAnno.SelectedValue)  
Dim wuc As UCView = CType(LoadControl("~/UCView.ascx"), UCView)  
wuc.IdAnalysis = idAnalysis  
wuc.ID = "ctrlView"  
wuc.UpdateControl()   ' Crea i controlli interni al Web User Control  
pnlView.Controls.Clear()  
pnlView.Controls.Add(wuc)  


Con questo codice gli eventi scatenati dal web user control (al suo interno ci sono dei linnkbutton) non venivano lanciati. Modificando però la sequenza delle istruzioni nel codice in questo modo:

  
Dim idAnalysis As Integer = Integer.Parse(ddlAnno.SelectedValue)  
Dim wuc As UCView = CType(LoadControl("~/UCView.ascx"), UCView)  
wuc.IdAnalysis = idAnalysis  
wuc.ID = "ctrlView"  
pnlView.Controls.Clear()  
pnlView.Controls.Add(wuc)  
wuc.UpdateControl()   <<--- MESSO IN FONDO AL CODICE  


in questo modo gli eventi vengono correttamente lanciati. Non riesco a capire come mai sia importante PRIMA aggiungere il web user control al pannello e SUCCESSIVAMENTE creare i controlli interni al web user contro.

Avete qualche idea a riguardo?

Grazie
Ciao
Federico
federico.orlandini wrote:
in questo modo gli eventi vengono correttamente lanciati. Non riesco a capire come mai sia importante PRIMA aggiungere il web user control al pannello e SUCCESSIVAMENTE creare i controlli interni al web user contro. Avete qualche idea a riguardo?

perchè tu, anche se lo stai "camuffando" da User Control, stai di fatto creando un composite control e fa molta differenza dove (cioè, quando) crei i controlli figli, specie se fanno postback.
http://www.aspitalia.com/script/912/Composite-Custom-Control-ASP.NET.aspx .

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
Ciao,

ok, già che il comportamento illustrato abbia un suo perché mi tranquillizza.
Ora devo cercare di capire meglio perché l'essere un composite control genera questa dipendenza del comportamento dalla sequenza di azioni eseguite dal codice....

Grazie
Ciao
Federico
federico.orlandini wrote:
Ora devo cercare di capire meglio perché l'essere un composite control genera questa dipendenza del comportamento dalla sequenza di azioni eseguite dal codice....

perchè quando un controllo ne include altri, ovviamente questi ultimi ne sono influenzati. tutto qui.
.

Daniele Bochicchio (ASPItalia.com)
I libri su HTML5, WP7, ASP.NET 4.0, VB 2010, C# 4, Entity Framework
Senior Software Architect @ 5DLabs.it
2 messaggi dal 26 agosto 2010
Un saluto a tutti, mi sono appena iscritto, e dopo diversi anni ho deciso di riprendere a programmare, e magari ogni tanto vi chiedero' qualche consiglio... e come adesso inzio anch'io ad esporre i miei problemi o meglio mi associo anch'io a questo problema.

creo una serie di pulsanti dinamicamente solo che non riesco a far eseguire l' OnCommand, non uso la OnClick in quanto devo passare un parametro, (ma neanche l'OnClick funziona).
Dopo dovrei fare un post... ma per il momento l'ho disabilitato.
Sembra come se l'evento non venisse visto... e non capisco il motivo.
di seguito il codice.


protect void DropDownList1_SelectedIndexChanged(object sender, Eventargs e)
{
.....
for (int i=0; i< ncolonne; i++)
{
CreaBottoni(i, dateBil[i].toString());
}
}

protect void CreaBottoni(int ncolonne, string txtBottone)
{
Button btn1 = new Button();
btn1.ID = "btn"+ncolonne.toString();
btn1.Text = txtBottone;
btn1.Visible = true;
btn1.CommandName = "Analisi";
btn1.CommandArgument = Convert.ToString(ncolonne);
// btn1.PostBackUrl = "~Analisi.aspx";
btn1.Command += new CommandEventHandler(btn1_Command);
this.Page.Form.Controls.Add(btn1);
}


void btn1_Command(object sender, CommandEventArgs e)
{
Response.Write ("Sono dentro"); // <-- non va... non mi vede l'evento
int k = (int) e.CommandArgument;
.....
}

please help me!!!!
Ciao,

il problema è che quei pulsanti vengono creati solo sull'evento DropDownList1_SelectedIndexChanged. Quando fai click su uno di questi pulsanti, viene fatto un postback della pagina durante il quale però DEVI RICREARE I PULSANT, altrimenti l'evento non verrà scatenato.

Ciao
Federico

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.