28 messaggi dal 09 ottobre 2006
Scusate ,
Ho bidogno di aiuto mi sono costruito un mio componente personalizzato inmmodo che sia in grado di generare e gestire degli eventi di postback. Fino ad un giorno fa andava correttamente ora non so che modifica ho fatto e non va più ho un altro compoenente che gestisce i postback definito allo stesso modo è funziona correttamente.
Quando viene visualizzato nella pagina il compoenente viene renderizzato correttamente in fatti io posso cliccarci sopra e la pagina viene ricaricata come effetto del postback, ma non viene eseguito il codice della funzione RaisePostbackEvent,( me ne accorgo dal fatto che ho inserito una stampa di log nel metodo e l'istruzione non viene eseguita) . Quali possono essere le cause di questo problema?

Questo è il rendering del componente nella pagina in cui lo uso:

<input onclick="__doPostBack('ctl00$contenuto$ctl02','')" id="ctl00_contenuto_ctl02" value="Gen" type="button" style="border:none; background:none; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:9; vertical-align:middle; text-align:center; " />

vi posto l'intera classe che ho scritto se riuscite a capirci qualcosa:
public class MonthSelector:WebControl,IPostBackEventHandler
{
bookingCalendar _parent;
public MonthSelector(bookingCalendar parent)
{
_parent = parent;
this.selected = false;
}

public int month
{
get
{

return (int)ViewState["month"];


}

set
{
ViewState["month"] = value;
}
}

public Boolean selected
{
get
{

return (Boolean)ViewState["selected"];


}

set
{
ViewState["selected"] = value;
}
}

public void RaisePostBackEvent(string eventArgument)
{
MyContext.getInstance().getLog().write(" Cambio mese");
_parent.setMese(this.month);
}

protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
PostBackOptions p = new PostBackOptions(this);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,Page.ClientScript.GetPostBackEventReference(p));
writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
String mese;
switch(this.month)
{
case 1:
{
mese = "Gen";
break;
}
case 2:
{
mese = "Feb";
break;
}
case 3:
{
mese ="Mar";
break;
}
case 4:
{
mese = "Apr";
break;
}
case 5:
{
mese = "Mag";
break;
}
case 6:
{
mese = "Giu";
break;
}
case 7:
{
mese ="Lug";
break;
}
case 8:
{
mese ="Ago";
break;
}
case 9:
{
mese = "Set";
break;
}
case 10:
{
mese = "Ott";
break;
}
case 11:
{
mese = "Nov";
break;
}
case 12:
{
mese = "Dic";
break;
}
default:
{
mese = "Errore";
break;
}
}
writer.AddAttribute(HtmlTextWriterAttribute.Value, mese);
String bkground="none";
if (this.selected)
{
bkground = "#F8CBC0";
}
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; background:"+bkground+"; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:9; vertical-align:middle; text-align:center; ");
writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}

}


Vi ringgrazio

ciao
il tuo controllo renderizza solo un input ?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
28 messaggi dal 09 ottobre 2006
Si è solo un pulsante di tipo button (sono alle prime armi con i controlli server e non ho molta dimistichezza), il quale viene caricato all'interno di un controllo server più complesso di tipo bookingCalendar (che viene passato anche come costruttore di questo oggetto) , quando viene effettuato il postback va a richiamare un metodo del Booking calenda associato (denominato _parent)

public void RaisePostBackEvent(string eventArgument)
{
MyContext.getInstance().getLog().write(" Cambio mese");
_parent.setMese(this.month);
}

Il fatto è, che visto che il rendering viene svolto bene non so perchè non viene eseguito il metodo di rispota al callback ( non so quale modifica ho fatto che ha portato a questo malfunzionamento prima andava tutto perfettamente ) .
credo che il problema sia da ricercarsi nel controllo più complesso (bookingCalendar ).

sarebbe utile conoscere la sua architettura,comunque per creare controlli complessi meglio derivare da CompositeControl, facilità lo sviluppo.

per comprendere meglio il problema posta anche il codice dichiarativo che usi nella pagina aspx.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
28 messaggi dal 09 ottobre 2006
Voglio seguire il tuo consiglio e riprogettare il componente , che avevo buttato giù a dire la verità molto velocemente infatti avevo esteso la classe table e mi ci sono costruito un mio compoenente sopra, ho letto diverse cose su come si crea un composite control ma non capisco una cosa.
Per inserire i componenti al suo interno devo usare il metodo CreateChildControls , dove creo i componenti che sono contenuti al suo interno, ma non capisco come viene gestito il render o meglio ogni figlio gestisce il proprio render . ma come gestisco il posizionamento all'interno del composite control? come posso dire , ad esempio, che un figlio deve apparire di lato ad un altro? in tutti gli esempi che ho letto venivano creati i controlli e poi sichiamavano i metodi add e basta, ma il posizionamento dove viene deciso e come?


Ti ringrazio
il posizionamento è solamente un aspetto di layout grafico, lo puoi (devi ) gestire tramite css.

meglio non mischiare l'aspetto visuale con quello logico.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
28 messaggi dal 09 ottobre 2006
Quindi gli assegno una classe css ad ogni compoenente tramite la quale definisco il posizionamento, mi consigli assoluto o relativo ? poi un'altra domanda

devo creare un controllo caratterizzato da una riga con dodici pulsanti uno per ogni mese dell'anno e in un area sotto stante devo caricare le settomane del mese in questione ora ho creato i dodici pulsanti in questa maniera presento solo gen per semplicità

Button gen = new Button();
gen.Text = "Gen";
gen.CssClass = "txt";
gen.Click += new EventHandler(OnMonthChange);

questo è l'handler che ho scritto
void OnMonthChange(object sender, EventArgs e)
{

String meses = ((Button)sender).Text;
MyContext.getInstance().getLog().write(meses);
switch (meses)
{
case "Gen": {
this.setMese(1);
break;
}
case "Feb":
{
this.setMese(2);
break;
}
case "Mar":
{
this.setMese(3);
break;
}
case "Apr":
{
this.setMese(4);
break;
}
case "Mag":
{
this.setMese(5);
break;
}
case "Giu":
{
this.setMese(6);
break;
}
case "Lug":
{
this.setMese(7);
break;
}
case "Ago":
{
this.setMese(8);
break;
}
case "Set":
{
this.setMese(9);
break;
}
case "Ott":
{
this.setMese(10);
break;
}
case "Nov":
{
this.setMese(11);
break;
}
case "Dic":
{
this.setMese(12);
break;
}
}
}

setMese è una funzione che modifica il mese corrente visualizzato, anche in questo caso ho utlizzato un mio logger per stampare delle stringhe utili per il debug e nella prova che ho fatto quando clicco sul pulsante la stringa no viene scritta su file di log( " il sistema di log funziona perchè l'ho usato molte volte") in linea logica è corretta la gestione dell'evento click?, con asp.net ho diverse difficolta perchè ho sempre utilizzato le jsp con struts :)

ti ringrazio per l'aiuto che mi stai fornendo

se mai ti dovesse servire qualcosa in java non esitare a contattarmi
28 messaggi dal 09 ottobre 2006
Dimenticavo la creazione dei button avviene nel metodo createchildcontrols

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.