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.