61 messaggi dal 25 settembre 2006
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
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
<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:UpdatePanel ID="updElencoApp" runat="server">
                        <ContentTemplate>
                                        <aspropDownList ID="ddlApplicazioni" runat="server" onSelectedIndexChanged="ddlApplicazioni_SelectedIndexChanged">
                                        </aspropDownList>
                                        <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" />
                                        <aspropDownList ID="ddlRuolo" runat="server">
                                        </aspropDownList>
<asp:LinkButton ID="btnSalva" runat="server" ToolTip="salva le modifiche" CssClass="btnDisabled"
                                            onClientClick="return Salva();" onClick="btnSalva_Click"> Salva </asp:LinkButton>
</ContentTemplate>
                    </asp:UpdatePanel>

Modificato da Another il 29 settembre 2010 09.40 -
prova impostando la property AutoPostback a true sulla DropDown

Davide Guida
Technical Architect @ Razorfish Healthware
http://davideguida.altervista.org
61 messaggi dal 25 settembre 2006
No il viewstate è attivo.

Dimenticavo di dirvi che c'è un UpdatePanel, lo evidenzio nel codice

l'AutoPostBack l'avevo a True fino alla release precedente, anche in conseguenza dell'UpdatePanel, poi l'ho disabilitato poichè secondo alcune fonti potrebbe andare in conflitto con la funzione CambiaApplicazione che richiamo sull'onchange, funzione che mi serve per memorizzare l'azione che sto facendo.. così ho spostato il postback in questa funzione..
61 messaggi dal 25 settembre 2006
Ho scoperto che il problema si verifica alla prima selezione della ddl.. riassumendo:

- al caricamento iniziale della pagina la selezione della ddl fa scattare il postback e di conseguenza c'è un evento selectedindexchanged catturato lato server (in realtà via ajax) = ok
- se premo Salva con la ddl non selezionata il custom validator mi visualizza l'errore
- successivamente seleziono la ddl e qui non c'è il postback, perciò l'evento non viene catturato ! il messaggio di errore adesso sparisce
- se però riseleziono la ddl su un'altra opzione il postback parte e l'evento catturato..

idee?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.