Newsgroup: it.comp.www.asp
Titolo: EditItemTemplete - Datalist

Sapete come si puņ fare ad aggiungere un usercontrol in un EditItemTemplate
di un datalist?
In altre parole dopo che l'utente ha cliccato riesco a referenziarmi solo
con l' ItemTemplate e non con EditItemTemplate, sapete come si puņ fare?
Grazie mille

 Grazie mille
Confesso che non ho mai provato ad aggiungere in run-time un usercontrol in
un datalist... cmq dovrebbe essere sufficiente inserire all'interno della
'definizione' dell'edit-template del datalist un placeholder:
<itemtamplate>
...
</itemtamplate>
<edititemtemplate>
...
<asp:placeholder id="uc" runat="server" />
</edititemtemplate>
E da codice, nell'evento Edit:
protected void DoItemEdit(Object sender, DataListCommandEventArgs e)
{
    ...
    PlaceHolder ucx;
    ucx=(PlaceHolder)DataList1.FindControl("uc")
    ucx.Controls.Add(LoadControl("tuo_user.ascx"));
}
E' una soluzione che ho pensato ora... se puoi provala e fammi sapere se
scopri qualcosa di nuovo o un'altra strada.
Ciao
--
AZ [Microsoft .NET MVP]

 wrote in message
news:bi2rm3$4jrtb$2...@ID-192116.news.uni-berlin.de...


 Grazie mille
Quella routine che ti ho segnalato per l'aggiunta dinamica
dell'user-control, hai provato ad inserirla nell'evento dell'itemtemplate?


 ha scritto nel messaggio
news:bi5he8$5c7he$2...@ID-192116.news.uni-berlin.de...


 venga chiuso, x questo volevo metterlo nel edittemplete
Ho fatto ora delle prove, ed ho trovato una soluzione che ti invito a
provare.
Nell'evento che imposta la riga desiderata nella modalità edit, aggiungi
questo codice:
DataList1.EditItemIndex = e.Item.ItemIndex
DataList1.Items(e.Item.ItemIndex).Controls.Add(LoadControl("tuousercontrol.a
scx"))
BindData() ' Qui reinserisco i dati nel datalist con una funzione apposita
L'ho testato ora, e quando premi il pulsante in modalità edit, viene
aggiunto l'user control indicato nel parametro del LoadControl. Fai delle
prove e fammi sapere!


Ops, piccola correzione: la routine per l'inserimento dei dati dev'essere
eseguito prima dell'aggiunta dell'user control:
BindData()
DataList1.EditItemIndex = e.Item.ItemIndex
DataList1.Items(e.Item.ItemIndex).Controls.Add(LoadControl("tuousercontrol.a
scx"))
Ciao


 wrote in message
news:biaig3$76oug$1...@ID-192116.news.uni-berlin.de...


 Grazie mille
Il perché è semplice: essendo un usercontrol inserito dinamicamente,
all'invio successivo della pagina tale user control dev'essere inserito
nuovamente, altrimenti viene giustamente cancellato.
Una soluzione al tuo problema potrebbe essere l'inserimento dell'usercontrol
non dinamicamente, ma direttamente nel campo EditItemTemplate in modo che
esso sarà visualizzato soltanto quando verrà selezionata tale riga.
Questa soluzione la puoi adottare se non cambi usercontrol per ogni riga...
Per quanto riguarda il problema di scaturire un evento dall'interno
dell'usercontrol che possa eseguire una funzione nella pagina principale, ti
consiglio di dare un'occhiata all'uso degli "Eventi". E' sufficiente
inserire un evento all'interno del tuo usercontrol collegato alla funzione
della pagina principale. Non ho testato questa soluzione, ma se puoi
provala.
Se scopri qualcosa fammi sapere, ok?


 wrote in message
news:bifmvo$8lbt6$8...@ID-192116.news.uni-berlin.de...


 Il pezzo che mi mancava era quello sull'onload
Ciao,
proprio oggi, incuriosito dalla possibilità di utilizzare gli eventi in
UserControl inseriti dinamicamente nel templateEdit dei server-command, ero
giunto anche io ad una soluzione (anche se io l'ho fatta in C#).
Nel mio esempio il datalist ha un pulsante che imposta la riga in modalità
edit, e all'interno del template è presente un UserControl con solo un
pulsante che richiama una funzione della pagina principale passandogli come
parametro l'ora attuale. Copio per completezza anche la mia versione, sai,
le nostre soluzioni possono essere utili anche a molti altri:
Pagina principale.aspx
----------------------
public class AZEventArgs : EventArgs
{
    private string _nome;
    public string Nome
    {
        set { _nome=value; }
        get { return _nome; }
    }
}
public class UsingEvent : 
System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataList DataList1;
private void Page_Load(object sender, System.EventArgs e)
{
    if (!Page.IsPostBack)
    {
        ViewState["edit"]=-1;
        BindData();
    }
    int quale=Convert.ToInt32(ViewState["edit"]);
    if (quale!=-1)
    {
        EsingEvent2 uc;
        uc=(EsingEvent2)DataList1.Items[quale].FindControl("EsingEvent21");
        uc.AZEvento+=new Esempio.AZHeaderEventHandler2(this.Scrivi);
    }
}
public void Scrivi(object o, AZEventArgs e)
{
    Response.Write("Delegate: "+e.Nome+"!<br>");
}
private void BindData()
{
    Hashtable a= new Hashtable();
    for (int i=0;i<10;i++) a.Add(i.ToString(),"Addio "+i.ToString());
    DataList1.DataSource=a;
    DataList1.EditItemIndex=Convert.ToInt32(ViewState["edit"]);
    DataList1.DataBind();
}
protected void seleziona(object o, DataListCommandEventArgs e)
{
    if (e.CommandName=="Select")
    {
        ViewState["edit"]=e.Item.ItemIndex;
        BindData();
    }
}
UsingEvent2.ascx:
-----------------
public delegate void AZHeaderEventHandler2(object s,AZEventArgs e);
public class EsingEvent2 : System.Web.UI.UserControl
{
    protected System.Web.UI.WebControls.Button Button1;
    public event AZHeaderEventHandler2 AZEvento;
    private void Button1_Click(object sender, System.EventArgs e)
    {
        AZEventArgs ea=new AZEventArgs();
        ea.Nome=DateTime.Now.ToString();
        AZEvento(this.ID,ea);
    }
}
Nell'esempio l'user control è inserito nell'datalist nel template edit, ma
possibile inserirlo dinamicamente ricordandosi di inserirlo ad ogni postback
(ho provato anche questo e funziona).
Ciao e alla prossima!
