Problema con Controllo Button creato dinamicamente

giovedì 26 agosto 2010 - 14.50
Tag Elenco Tags  C#  |  .NET 2.0  |  Windows XP  |  Visual Studio 2005  |  SQL Server Express  |  Access (.mdb)  |  Office 2003  |  Internet Explorer 7.0  |  Javascript  |  CSS 3.0

l_u_c_a Profilo | Newbie

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 per fare dei controlli.
Il problema e' con l'istruzione CommandEventHandler in quanto sembra come se l'evento non venga 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!!!!

Gluck74 Profilo | Guru

Per caso hai un update panel e/o uno script manager?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

l_u_c_a Profilo | Newbie

no, nessuno dei due.
creo la pagina e basta... i pulsanti creati vengono visualizzati, i dati che mi interessano vengono caricati una GridView.. e poi a seconda del pulsante premuto dovrei eseguire l'evento... per sicurezza ho provato a ricaricare la stessa pagina mettendoci un Response.Write("sono dentro") solo che non riesce ad accedere all'evento tramite l'EventHandler .
Dovrei utilizzare un UpdatePanel???
non l'ho mai utilizzato come controllo

Gluck74 Profilo | Guru

ho trovato degli errori di sintassi; quale editor usi?

1 - Davanti alle funzioni hai scritto "protect" invece di "Protected"
2 - Il metodo "toString" si scrive in maiuscolo: "ToString"

A parte questo, segui questa procedura:

nella crazione dei pulsanti, sostisuisci la riga
btn1.Command += new CommandEventHandler(btn1_Command);
con
btn1.OnClientClick = string.Concat( Page.ClientScript.GetPostBackEventReference(btn, Convert.ToString(ncolonne)), "; return false;" );

nel load della pagina inserisci queste righe:
string evTarg = Request["__EVENTTARGET"]; string evArgs = Request["__EVENTARGUMENT"]; this.btn_Click(null, new CommandEventArgs(evTarg, evArgs));

sostituisci la funzione btn1_Command con btn_Click (attento ai parametri)

fammi sapere

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

Pinky Profilo | Junior Member

Gli eventi vengono scatenati perchè quando la pagina viene creata dopo il post l'engine di ASP.NET "decide" quali eventi debbano essere scatenati leggendo i dati di post e verificando che il controllo che lo ha scatenato esista.
Ma in questo momento il bottone che ha generato il Command (od il Click) semplicemente non esiste, dato che l'evento in cui vengono creati è avvenuto nel post precedente. Infatti oltre a non scatenarsi l'evento, non vengono visualizzati i bottoni... giusto?
L'evento non può essere quindi scatenato.

ciao
Alessandro

l_u_c_a Profilo | Newbie

ciao Gluck74
come editor utilizzo VStudio 2005, solo che il pc dal quale ho copiato il codice non avevo la posta in uscita, e quindi l'ho copiato a mano... quindi gli errori ci stavano

Purtroppo non riesco a capire bene l'OnClientClick.
In questo caso, utilizzando questo non dovrei utilizzare javascript????

e come parametri cosa devo passarci????

l_u_c_a Profilo | Newbie

Ho modificato il codice, dividendo la pagina in 2.
Nella prima faccio la scelta col dropdownlist interrogando il db
nella pagina2 nell'evento OnLoad ho spostato la funzione "creaBottoni(int ncolonne, string txtBottone)"
In questo modo, pensavo che la pagina non facendo nessun postback all'interno non avesse problemi e i bottoni avrebbero funzionato.
I bottoni vengono visualizzati la prima volta nella pagina, se poi faccio click su uno di questi.... questi spariscono
Invece non e' cosi'

Gluck74 Profilo | Guru

io ho ricreato la tua situazione su unica pagina, ed ho inserito il codice come ti ho suggerito prima.
Funziona tutto.

Segui le mie istruzioni (pagina unica e onClientClick).

per quanto riguarda il javascript, con l'istruzione che ti ho dato io (Page.ClientScript.GetPostBackEventReference) viene gestito in automatico, quindi non ti preoccupare di questo


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

l_u_c_a Profilo | Newbie

ci sono riuscito!!!!
Ho utilizzato un altra strada anziche' quella del OnClientClick, in quanto non mi veniva.
Utlizzando un placeHolder, ho inserito tutto nell'evento Load!
la struttura che ho utilizzato e' la seguente

nella pagina di design:
<div>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</div>


protected void Page_Load(object sender, EventArgs e)
{
....
CreaBottoni(i, dateInBilancio[i].ToString());
}

protected void CreaBottoni(int ncolonne, string txtBottone)
{
Button btn1 = new Button();
btn1.ID = "btn" + ncolonne.ToString();
btn1.Text = txtBottone;
btn1.Visible = true;
btn1.CommandName = "AnalisiIndici";
btn1.CommandArgument = Convert.ToString(ncolonne);
btn1.Command +=new CommandEventHandler(btn1_Command);

// btn1.PostBackUrl = "~/Analisi.aspx";
this.PlaceHolder1.Controls.Add(btn1);


}

protected void btn1_Command(object sender, CommandEventArgs e)
{
this.Literal1.Text = "sono dentro";
int k = Convert.ToInt16( e.CommandArgument); //variabile che mi da la colonna dalla quale ricavare i dati
}
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5