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.