Event Handler ASCX

giovedì 11 ottobre 2007 - 14.24

paolomanfrin Profilo | Newbie

Buongiorno a tutti... io ho il seguente problema:
Una pagina ASPX genera dinamicamente una serie di User Control ASCX e li popola. Ogni user control contiene diverse textbox ed un bottone.
Al bottone, sempre interno all'ASCX è associato il seguente Event Handler:

protected void BtnModifica_Click(object sender, EventArgs e)
{

Session["ID"] = TextBoxId.Text;
Session["Marca"] = TextBoxMarca.Text;
Session["DataInserimento"] = TextBoxDataInserimento.Text;
Server.Transfer("ModificaAnnuncio.aspx");
}

Io vorrei che tali dati fossero passati alla pagina ModificaAnnuncio.aspx ma non funziona... quello che succede è che viene ricaricata la pagina ASPX...

Grazie a tutti coloro che sapranno darmi una mano...

Wamba Profilo | Expert

>Buongiorno a tutti... io ho il seguente problema:
>Una pagina ASPX genera dinamicamente una serie di User Control
>ASCX e li popola. Ogni user control contiene diverse textbox
>ed un bottone.
>Al bottone, sempre interno all'ASCX è associato il seguente Event
>Handler:
>
>protected void BtnModifica_Click(object sender, EventArgs e)
> {
>
> Session["ID"] = TextBoxId.Text;
> Session["Marca"] = TextBoxMarca.Text;
>Session["DataInserimento"] = TextBoxDataInserimento.Text;
> Server.Transfer("ModificaAnnuncio.aspx");
> }
>
>Io vorrei che tali dati fossero passati alla pagina ModificaAnnuncio.aspx
>ma non funziona... quello che succede è che viene ricaricata
>la pagina ASPX...
>
>Grazie a tutti coloro che sapranno darmi una mano...

La pagina si ricarica a seguito del postback. quello che devi fare è assegnare al pulsane che esegue il postback un postbackurl alla pagina ModificaAnnuncio.aspx poi da li recuperare i due valori che ti servono attraverso page.previouspage.

-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie

Ciao, La soluzione che mi hai proposo non funziona in quanto con il seguente comando....

String x = ((TextBox)PreviousPage.FindControl("TextBoxProva")).Text;

mi vengono resituiti controlli presenti nella pagina ASPX, non controlli all'interno degli User Control ASCX contenuti nella pagina ASPX.
Grazie Comunque.

Attendo suggerimenti!....

Wamba Profilo | Expert

Suppongo che trovi il tuo ascx con la find. Puoi mettere un paio di property server side nel tuo controllo che ti restituiscano il valore di quei due controlli, oppure prova così:
String x = (PreviousPage.FindControl("MioASCXID").FindControl("TextBoxProva") as TextBox).Text

Stò andando a braccio, purtroppo non ho il tempo di fare prove.


-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie


Il problema è il seguente... dato che gli user control ASCX sono molteplici, se assegno lo stesso "MioASCXID", punterà sempre al primo ( o all'ultimo... ).
Se assegno differenti ID al "MioASCXID" ( uno per ogni ASCX ), alla fine mi ritrovo a dover applicare la PreviousPage.FindControl senza sapere quale "MioASCXID" mi serve....

Wamba Profilo | Expert

prova a vedere cosa ti arriva nel request della pagina (i parametri) se non sai come fare attiva il trace. Secondo me li trovi l'id del controllo che ha causato il postback.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie

Il problema penso dipenda dal fatto che la pagina esegue il reload... Quando viene premuto il bottone nell' User Control il postback non dovrebbe modificare lo stato della pagina...
Ho fatto anche la seguente prova:

Ho creato una User Control con una texbox ed un bottone ( dove clikkando il bottone viene scritto "ciao" sulla textbox ).

Ho creato una pagina Prova1.aspx che crea 5 User Control... tutto funziona perfettamente

Ho creato una pagina Prova2.aspx che crea alcune User Control in maniera random... e succede quanto segue:
- Se alla prima generazione sono stati creati 10 pulsanti e alla seconda 7 e io avevo premuto l'8 oppure 9 o 10 non funziona piu!!
- Se alla prima generazione sono stati creati 10 pulsanti e alla seconda 7 e io avevo premuto un pulsante tra 1 e 7 allora funziona!

Dovrei trovare un modo per non modificare lo stato che si era creato alla prima inizializzazione, poi io eventualmente con i delegate posso modificare la pagina... ma non so come conservare lo stato precedente

Wamba Profilo | Expert

I controlli dinamici non sono cose semplici da utilizzare, questo perchè il viewstate non li mantiene nell'albero. In teoria dovresti prima di tutto ricostruire lo stato precedente. Secondo devi andare ad eseguire gli eventi (normale ciclo di pagina) e poi andare a ricostruirti la nuova struttura da mandare al client.
Prima di impazzire dietro a tutta questa montagna di lavoro, io mi porrei la domanda se non fosse possibile usare un oggetto come il repeater. L'effetto che ottieni è molto simile, ma non hai problemi nel ricostruire l'albero ad ogni postback.
Oppure utilizzare un js con un campo hidden "idpremuto". Su ogni pulsante inserisci onclientclick="miohidden.value = " mioId + ";" al postback non leghi l'evento al pulsante ottenendo un postback privo di geastione degli eventi. Su l'onload della pagina vai ad analizzare se IspostBack == true e il tuo hidden contiene un valore valido allora esegui quello che devi eseguire.

Spero di essere stato chiaro perchè vado un po' corsa. Se non hai capito qualcosa chiedi pure.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie

Ciao, ti ringrazio per la risposta.
Volevo esprimere alcune mie considerazioni:
1. Mi sembra strano che non siano state implementate funzionalità per permettere la ricostruzione della pagina precedente ( ammetto comunque che il discorso è alquanto problematico ).
2. Il repeater non mi sembra una buona soluzione in quanto il controllo avviene da "fuori" la pagina ASCX, e questo va "contro" le regole della programmazione ad oggetti... allora tanto vale che creo a runtime dei bottoni nella pagina master invece che nei controlli ASCX e in questo modo risolvo il problema
3. Le pagine ASCX sono più flessibili ( .... una volta risolto il problema... se lo risolverò.... ) da maneggiare.
Continuerò nella ricerca della soluzione.... Prima devo comunque capire il perchè del funzionamento anomalo citato nel precedente post.
Ti ringrazio per i suggerimenti.
Paolo.

Wamba Profilo | Expert

Il problema del comportamento anomalo è semplice:
1) Costruisci una pagina con 10 controlli (C_0, C_2, ... , C_9)
2) Clicci su C_8 PostBack
3) Ricostruisci la pagina con 7 controlli (C_0, C_2, ... , C_7)
4) Per gestire l'evento click di C_8 cerca l'oggetto C_8 e non lo trova
5) BUM.

-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie

Ok, ma anche gli altri oggetti sono stati "ricreati"... in teoria non dovrebbe trovare il riferimento neanche per questi....
E quindi io mi aspetterei un BUM! su tutto....

Wamba Profilo | Expert

C_8 non è stato ricreato, gli altri si.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

paolomanfrin Profilo | Newbie

si ma... ricreato intendo che cambia il riferimento in memoria quindi l'oggetto precedente anche se con lo stesso nome non esiste piu....l
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5