Ciao ho un problema con una form di inserimento dati di cui riporto di seguito estratti di codice.

Il punto è che se modifico la selezione nella DDL prima di fare click su Salva, tutto bene, se invece genero un errore sul validatore e poi riseleziono un valore corretto l'evento di SelectedIndexChanged non viene catturato e quindi la seconda ddl non viene popolata.

.cs
codice:
protected void Page_Load(object sender, EventArgs e)
        {
            ddlApplicazioni.Attributes.Add("onchange", "return CambiaApplicazione('ddlApplicazioni','');");
            txtUID.Attributes.Add("onchange", "ImpostaBtnSalva(true,true);");

            if (!Page.IsPostBack)
            {
                CaricaUtenti();
                // inizializza campi applicazione e ruolo
                InizializzaCampi(0);
            }
        }

        protected void ddlApplicazioni_SelectedIndexChanged(object sender, EventArgs e)
        { 
            // ad ogni variazione compila di conseguenza il ddlRuolo
            int idapp = Convert.ToInt32(ddlApplicazioni.SelectedValue);

            // ruolo
            string strSQL = "   SELECT  RuoliApplicazioni.IDRuolo, Ruoli.Ruolo " +
                                "   FROM    RuoliApplicazioni " +
                                "       INNER JOIN Ruoli ON RuoliApplicazioni.IDRuolo = Ruoli.IDRuolo " +
                                "   WHERE   IDApplicazione = " + idapp.ToString();
            FComuni fc = new FComuni();
            fc.RiempieDDL(ddlRuolo, idapp.ToString(), _connDb, strSQL, false);
        }
.aspx
codice:
<script language="javascript" type="text/javascript">
        var btnElimina_abilitato = false;
        var btnSalva_abilitato = false;
        // conferma il salvataggio
        function Salva() {
            if (btnSalva_abilitato) {
                avanti = confirm("Confermi le modifiche?");

                if (avanti) {
                    var idut = document.getElementById("ctl00_cphMain_hidID").value;

                    if (idut == 0) {
                        // nuovo
                        var uid = document.getElementById("ctl00_cphMain_txtUID").value;

                        // controlla se l'utente esiste già (uid)
                        var esiste = false;

                        var uids = "";
                        var nrighe = dgElencoUtenti.get_table().getRowCount();

                        for (i = 0; i < nrighe; i++) {
                            uids = dgElencoUtenti.Data[i][1];
                            if (uids == uid) {
                                esiste = true;
                                break;
                            }
                        }

                        if (esiste) {
                            alert("L'utente risulta già presente nel database.");
                            return false;
                        }
                    }
                    Page_ClientValidate('');

                    return Page_IsValid;

                    document.getElementById("ctl00_cphMain_hidAzione").value = "salva";
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }

        // validazione del controllo ddlApplicazioni
        function ControllaApplicazione(source, clientside_arguments) {

            var idut = document.getElementById("ctl00_cphMain_hidID").value;
            var uid = document.getElementById("ctl00_cphMain_txtUID").value;

            if (btnSalva_abilitato == false && uid != "")
                ImpostaBtnSalva(true, true);

            var ddlApp = document.all ? document.all["ctl00_cphMain_ddlApplicazioni"] : document.getElementById("ctl00_cphMain_ddlApplicazioni");
            var idApp = ddlApp.value;

            var ddlRuolo = document.all ? document.all["ctl00_cphMain_ddlRuolo"] : document.getElementById("ctl00_cphMain_ddlRuolo");

            if (idut == 0) {
                // devo impostare un ruolo utente per una data applicazione
                if (idApp == 0)
                    clientside_arguments.IsValid = false;
                else {
                    clientside_arguments.IsValid = true;
                }
            }
            else
                clientside_arguments.IsValid = true;
        }

        // alla modifica di ddlApplicazioni
        function CambiaApplicazione(eventTarget, eventArgument) {
            document.getElementById('ctl00_cphMain_hidAzione').value = 'cambioApplicazione';

            __doPostBack(eventTarget, eventArgument);
            return true;    // Page_IsValid ?
        }
    </script>

                                        <asp:DropDownList ID="ddlApplicazioni" runat="server" OnSelectedIndexChanged="ddlApplicazioni_SelectedIndexChanged">
                                        </asp:DropDownList>
                                        <asp:CustomValidator ID="ddlApplicazioni_cv" runat="server" ErrorMessage="selezionare l'applicazione"
                                            ControlToValidate="ddlApplicazioni" CssClass="validator_message" Display="Dynamic" ClientValidationFunction="ControllaApplicazione" ValidateEmptyText="True"></asp:CustomValidator>
                                        <asp:HiddenField ID="hidAzione" runat="server" />
                                        <asp:DropDownList ID="ddlRuolo" runat="server">
                                        </asp:DropDownList>
<asp:LinkButton ID="btnSalva" runat="server" ToolTip="salva le modifiche" CssClass="btnDisabled"
                                            OnClientClick="return Salva();" OnClick="btnSalva_Click"> Salva </asp:LinkButton>