3 messaggi dal 04 aprile 2005
Salve, dopo aver letto l'articolo,ho provato a creare una mia classe.Eccola

public class RepeaterAGruppi : Repeater
{
private string key;
private TipoConfronto Tipo = TipoConfronto.SoloIniziale;
private ITemplate _TemplateGruppo;
private object Ultimo = null;

[TemplateContainer(typeof(HeaderGruppo))]
public ITemplate TemplateGruppo
{
set { _TemplateGruppo = value; }
get { return _TemplateGruppo; }
}

public string Gruppo
{
set { key = value; }
get { return key; }
}

public TipoConfronto TipoDiConfronto
{
set { Tipo = (TipoConfronto)Enum.Parse(typeof(TipoConfronto), value.ToString(), true); }
get { return Tipo; }
}

public RepeaterAGruppi()
{
this.ItemCreated += new RepeaterItemEventHandler(Custom_OnItemCreated);
}

private void Custom_OnItemCreated(object sender,RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
if (e.Item.DataItem != null && key != null)
{
bool verifica = false;
verifica = Confronta(e.Item.DataItem, Ultimo,this.key, Tipo);
if (verifica)
{
HeaderGruppo header = new HeaderGruppo();
_TemplateGruppo.InstantiateIn(header);
header.DataItem = e.Item.DataItem;
this.Controls.Add(header);

header.DataBind();
}
}
Ultimo = e.Item.DataItem;
}
}

private bool Confronta(object x, object y,string Key, TipoConfronto Tipo)
{
DataRowView A = (DataRowView) x;
DataRowView B = (DataRowView) y;

if (A != null)
{
string Valore = A[Key].ToString();
string Ultimo = String.Empty;

if (B != null)
Ultimo= B[Key].ToString();

switch (Tipo){
case TipoConfronto.Completo:
return Valore.CompareTo(Ultimo) > 0;
break;
case TipoConfronto.SoloIniziale:
if (Ultimo == String.Empty)
return true;
else
return Valore.Substring(0,1).ToUpper().CompareTo(Ultimo.Substring(0,1).ToUpper()) > 0;
break;
}

return false;
}
else
return false;
}

public enum TipoConfronto
{
Completo,
SoloIniziale
}

public class HeaderGruppo : Control, INamingContainer
{
private object _dataItem;

public virtual object DataItem
{
get { return _dataItem; }
set { _dataItem = value; }
}
}
}

Funziona tutto perfettamente, tranne una cosa. Appena provo ad aggiungere un controllo in TemplateGruppo, non mi riesce più di accedere alle proprietà del controllo e modificarle in fase di runtime attraverso ad esempio l'evento onitemdatabound del repeater.

Spero di essere stato chiaro.
Grazie
In che senso non ti riesce più accedere alle proprietà? Ti dà errore?

Ciao

Il mio blog
Homepage
3 messaggi dal 04 aprile 2005
No, è solo che non mantiene i cambiamenti.
Ad esempio inserisco un button nel TemplateGruppo e in fase di binding dati (evento OnDataBound) del repeater voglio cambiare la proprietà text del button, con una nuova scritta personalizzata.
Facendo tutte le prove possibili e immaginabili, riesco a risalire al controllo,
riesco a modificare la proprietà text (richiamandola subito dopo con un trace.write vedo la modifica), solo che una volta caricata la pagina, questa viene persa.
Se a differenza associo un evento al click del button questo viene tranquillamente eseguito.

Sto facendo qualche altra prova per vedere se anche l'evento OnItemCommand del Repeater viene eseguito senza problemi.

Grazie per la risposta
Ah ho capito. Leggi bene l'articolo perché il repeater come i suoi controlli simili, hanno due fasi: creazione(ItemCreated)/databind(ItemDataBound).
La prima volta queste fasi avvengono normalmente. Quando fai un postback, parte solo la prima (la creazione), ma non il secondo. Crea l'albero dei controlli ed interviene il viewstate a caricare le proprietà.
Nel tuo codice fai sempre affidamento a dataitem che non c'è nel postback. Se invece c'è è perché hai rifatto il databind che di solito si evita con !IsPostback. Se così hai fatto allora perdi tutto quello che hai impostato prima (il problema ce l'hai anche se tu stessi usando un repeater normale). Guarda bene il mio codice e comprendilo in tutte le parti che capirai.

Ciao

Il mio blog
Homepage
3 messaggi dal 04 aprile 2005
Cmq questo problema lo da anche senza il postback.Il problema del postback che non mi ricrea i templateitems è una cosa che non ho gestito,perchè mi sono soffermato per cercare di risolvere questo problema.
Leggendo nel trace l'elenco dei controlli, vedo che questi sono tutti creati(tra cui anche il mio button). Non riesco a spiegarmi il perchè non riesca ad impostare le proprietà del controllo in runtime.

Cmq grazie del supporto...

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.