Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Creazione Dinamica DropDownList

    Ciao,


    Sto scrivendo una pagina Aspx in cui vengono create dinamicamente a runtime N dropdownlist a seconda di determinate azioni che non sono in grado di calcolare in anticipo...

    Io riesco a creare correttamente tutte le DropDown e le inserisco tutte dentro un PlaceHolder, il problema è che quando eseguo il postback il placeholder mi risulta vuoto (avendo creato i controlli a runtime) e non riesco a capire quale sia la miglior soluzione per leggere quale valori ha selezionato l'utente...


    Qualcuno può darmi una mano?


    codice:
                    DropDownList dl = new DropDownList();
                    dl.Items.Add("uno");
                    dl.Items.Add("due");
                    dl.Items.Add("tre");
                    cont.Controls.Add(dl);
    
                    dl = new DropDownList();
                    dl.Items.Add("quattro");
                    dl.Items.Add("cinque");
                    dl.Items.Add("sei");
                    cont.Controls.Add(dl);
    
                    dl = new DropDownList();
                    dl.Items.Add("sette");
                    dl.Items.Add("otto");
                    dl.Items.Add("nove");
                    cont.Controls.Add(dl);
    
                    PlaceHolder1.Controls.Add(cont);
    
    ------------------------------------
    
    
    protected void Button1_Click(object sender, EventArgs e)
            {
                var test = PlaceHolder1.Controls.Count; //Questo da 0 
            }
    Grazie

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    i controlli dinamici vanno obbligatoriamente ricreati ad ogni postback. questo lo fai ?

  3. #3
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Questo è il codice
    codice:
    Num DDL da creare:
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Postback!" />
    
            <asp:PlaceHolder ID="PlaceHolder1" runat="server" EnableViewState="false"></asp:PlaceHolder>
            <asp:Button ID="Button2" runat="server" Text="Risultati" OnClick="Button2_Click" />
    
            <asp:PlaceHolder ID="PlaceHolder2" runat="server"></asp:PlaceHolder>
    codice:
    public partial class WebForm1 : Page
        {
            Random rnd = new Random();
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (IsPostBack)
                {
                    int n = int.Parse(TextBox1.Text);
                    for (int i = 0; i < n; i++)
                    {
                        DropDownList ddl = new DropDownList();
                        ddl.Items.Add(new ListItem("Uno"));
                        ddl.Items.Add(new ListItem("Due"));
                        ddl.Items.Add(new ListItem("Tre"));
                        ddl.Items.Add(new ListItem("Quattro"));
    
                        //ddl.ID = rnd.Next(10000).ToString();
                        
    
                        PlaceHolder1.Controls.Add(ddl);
                    }
                }
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                foreach (Control ddl in PlaceHolder1.Controls)
                {
                    string risultato = (ddl as DropDownList).SelectedValue;
                    Label lbl = new Label { Text = ddl.ID + " - " + risultato + "
    " };
                    PlaceHolder2.Controls.Add(lbl);
                }
            }
        }
    Non devi preoccuparti di ricreare le DDL al pageLoad perché al postback asp.net fa la "magia" di riportarle allo stato in cui erano quando è arrivata la richiesta di postback. Questo grazie al fatto che anche lo stato dei controlli creati a Runtime viene memorizzato nel viewstate.

    Di norma questo è il comportamento che ti aspetti ma attento: non c'è modo di eliminare questo comportamento per le DDL. L'unico trick che funziona è essere sicuri di dare un ID diverso alla DDL prima di salvarla. In tal modo viene usato l'ID come chiave per memorizzare i dati nel ControlState. Per verificarlo prova a scommentare l'assegnazione random dell'id e vedrai che tra i postback le DDL non conserveranno più il SelectedIndex.

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887

    Non devi preoccuparti di ricreare le DDL al pageLoad
    piccola precisazione: DEVE farlo, ma non deve preoccuparsi di ricreare il loro stato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.