Con risposta dropdownlist .selectedvalue

  • mercoledì 9 maggio 2012 09:14
     
      Contiene codice

    Mi si verifica questo problema:

    sul postback dell'evento load assegno un valore alla dropdownlist:

    If Not IsPostBack Then
    
       Nome.SelectedValue.Item("Nome")
    
    end if

    quando eseguo un postback, per esempio clicco un pulsante, il valore della drop 'Nome' viene riassegnato al primo dato in elenco.

    Se invece Sono io a modificare il contenuto della drop 'Nome' (scegliendo manualmente il valore dalla lista a discesa), anche dopo un postback, il valore della stessa non cambia.

    Spero di essere stato abbastanza chiaro. Come posso ovviare a l problema?

Tutte le risposte

  • mercoledì 9 maggio 2012 09:34
     
     

    Usa enableviewstate = true.

    Ciao Fammi sapere.

  • mercoledì 9 maggio 2012 09:52
     
     
    NO, non cambia nulla
  • mercoledì 9 maggio 2012 10:20
     
      Contiene codice

    Addirittura ora Ho verificato che la problematica esiste anche su altre drop, mi spiego:

    Avviene solo alla proma scelta, per esempio in un'altra drop ho l'elenco dei comuni, dopo il form load scelgo un comune e mi ritorna sul primo

    poi lo faccio nuovamente e mi rimane selezionata la voce interessata.

    come se rieseguisse 

    If Not IsPostBack Then Nome.SelectedValue.Item("Nome") end if


  • mercoledì 9 maggio 2012 10:32
     
      Contiene codice

    Da quello che ho capito "Nome" è una DropDownList.

    Questo controllo ha come proprietà "SelectedValue" che è una string:
    Ottiene il valore dell'elemento selezionato nel controllo elenco o seleziona l'elemento nel controllo elenco che contiene il valore specificato.

    Quindi la riga di comando che hai scritto tu, non credo proprio sia corretta.
    Se vuoi selezionare un valore, devi fare così:

    Nome.SelectedValue = "valoredaselezionare"


    Programamtore ASP.NET
    http://glucolo.wordpress.com

  • mercoledì 9 maggio 2012 10:35
     
     

    no, quello va bene, ho sbagliato a trascriverlo

    Nome.SelectedValue = .Item("Nome")

    chiaramente sono all'interno di un with ... end with,

    ho modificato il codice per semplificare le cose

  • mercoledì 9 maggio 2012 10:44
     
      Contiene codice

    se può essere d'aiuto:

    <asp:DropDownList ID="comune" onselectedindexchanged="comune_SelectedIndexChanged" runat="server" AutoPostBack="true" ></asp:DropDownList>

    Sub Comune_SelectedIndexChanged()
           
            MsgBox("Prova")
        End Sub

  • mercoledì 9 maggio 2012 11:19
    Postatore
     
     
    Come e dove popoli la DropDownList in questione?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • mercoledì 9 maggio 2012 12:23
     
      Contiene codice

    avevo semplificato le cose cambiando i nomi per rendere più leggibile, ora posto il codice reale:

     Protected Sub Condizione_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            RiempiSottoCondizione(Condizione.SelectedValue)
        End Sub
        
        Sub RiempiSottoCondizione(ByVal Condizione As Integer)
            
            Sottocondizione.Items.Clear()
            LC.cn.Open()
            
            sql = "select * from Vista_IMU_Aliquote where IDCondizione=" & Condizione & " and Anno=" & Session("AnnoRiferimento") & " order by Sottocondizione"
            cmd = New SqlCommand(sql, LC.cn)
            
            Sottocondizione.DataSource = cmd.ExecuteReader()
            Sottocondizione.DataTextField = "Sottocondizione"
            Sottocondizione.DataValueField = "IDSottocondizione"
            Sottocondizione.DataBind()
            Sottocondizione.Dispose()
            LC.cn.Close()
           
        End Sub

  • mercoledì 9 maggio 2012 12:29
    Postatore
     
     

    In questo caso, avevi semplificato troppo, tralasciando alcune parti importanti.

    Tuttavia, ad essere sincero, ora che hai mostrato questo codice non capisco il nesso con la tua domanda iniziale... All'inizio parlavi di una DropDownList, ora invece ne hai due:

    1. come popoli la lista Condizione?
    2. qual è quella per cui non viene mantenuto il valore dopo il postback? Si tratta di Condizione?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • mercoledì 9 maggio 2012 12:47
     
      Contiene codice
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not IsPostBack Then
                
      Riempi()
    
      With dstCarrello.Tables("Carrello").Rows(0)
      Condizione.SelectedValue = .Item("IDCondizione")
      end with
                
    End If
    end sub
    
    
    
    Sub Riempi()
    
    
       LC.cn.Open()
       cmd = New SqlCommand("select * from Vista_Oggetti_Condizioni", LC.cn)
                        Condizione.DataSource = cmd.ExecuteReader()
                        Condizione.DataTextField = "Condizione"
                        Condizione.DataValueField = "IDCondizione"
                        Condizione.DataBind()
                        Condizione.Dispose()
                        LC.cn.Close()
                        Condizione.SelectedValue = .Item("IDCondizione")
                        RiempiSottoCondizione(Condizione.SelectedValue)
                        Sottocondizione.SelectedValue = .Item("IDSottoCondizione")
    
    end sub
    Entrambe le dprop hanno lo stesso problema
  • mercoledì 9 maggio 2012 12:51
     
      Contiene codice

    ho visto un'errore e ho modificato così:

    With dstCarrello.Tables("Carrello_Sessione").Rows(0)
                        MesiPossesso.Text = LC.Nullo_Stringa(.Item("MesiPossesso"))
                        Condizione.SelectedValue = LC.Nullo_Zero(.Item("IDCondizione"))
                        RiempiSottoCondizione(Condizione.SelectedValue)
                        Sottocondizione.SelectedValue = LC.Nullo_Zero(.Item("IDSottoCondizione"))
                    End With

    quindi ho eliminato queste linee dalla sub Riempi:

    Condizione.SelectedValue = .Item("IDCondizione")
                        RiempiSottoCondizione(Condizione.SelectedValue)
                        Sottocondizione.SelectedValue = .Item("IDSottoCondizione")

  • mercoledì 9 maggio 2012 13:19
     
     
  • mercoledì 9 maggio 2012 13:23
     
     

    No, il mio problema non è popolare più dropdownlist a catena, una dipendente dall'altra.

    Il problema, ripeto, e chè al primo postback non mi prende il valore che seleziono da una qualsiasi drop, ma il primo valore della lista, dopodichè al nuovo postback lo prende

  • mercoledì 9 maggio 2012 13:34
    Postatore
     
     

    Scusa se ti sembro ripetitivo, ma lo faccio solo per essere sicuro di aver capito bene la tua situazione...

    Come esegui il primo postback, per cui non prende il valore? Nel markup che avevi mostrato prima, la DropDownList ha la proprietà AutoPostBack a true, quindi parli del postback generato quando cambi la selezione nella lista? Perché all'inizio parlavi di un pulsante...


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • mercoledì 9 maggio 2012 14:09
     
     

    Dunque, hai una DDL "condizione" e una "Sottocondizione"

    La prima viene riempita dalla sub riempi(), la seconda subito dopo e dipende da condizione.selectedValue

    inoltre quando cambi valore alla condizione, ricarichi nuovamente la sottocondizione in base al nuovo valore di condizione.selected ( autopostback=true ?? )

    A me sembra proprio un caso di dorpdown dipendenti in cascata

    Comunque...
    il problema potrebbe essere nella riga with ....
    potrebbe essere che dstCarrello.Tables("Carrello").Rows(0) non contenga un valore valido
    potrebbe essere che  .Item("IDCondizione") non sia un valore contenuto nella dropdown, quindi la DDL va all'indice -1 (nessun valore selezionato)

    hai provato in debug, appena eseguita l'istruzione Condizione.SelectedValue = .Item("IDCondizione"), che SelectedIndex ha la dropdownlist?

    P.S.:
    puoi togliere le dispose() delle DDL?


    Programamtore ASP.NET
    http://glucolo.wordpress.com


  • mercoledì 9 maggio 2012 14:12
     
     
    si pensandoci potresti aver ragione facciao una verifica
  • giovedì 10 maggio 2012 09:08
     
     
     

    Il problema persiste.

    l'esempio riportato da www.cmsaspnet.com in che momento devo eseguire la procedura descritta?

    dopo il popolamento della ddl?

  • giovedì 10 maggio 2012 10:29
     
      Contiene codice

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If Not IsPostBack Then LC.cn.Open() cmd = New SqlCommand("select * from Vista_Oggetti_Condizioni order by Condizione", LC.cn) Condizione.DataSource = cmd.ExecuteReader() Condizione.DataTextField = "Condizione" Condizione.DataValueField = "IDCondizione" Condizione.DataBind() Condizione.Dispose() LC.cn.Close() Condizione.SelectedValue = 2 RiempiSottoCondizione(Condizione.SelectedValue) End If End Sub Protected Sub Condizione_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) RiempiSottoCondizione(Condizione.SelectedValue) End Sub Sub RiempiSottoCondizione(ByVal Condizione As Integer) Sottocondizione.Items.Clear() LC.cn.Open() sql = "select * from Vista_IMU_Aliquote where IDCondizione=" & Condizione & " and Anno=2011 order by Sottocondizione" cmd = New SqlCommand(sql, LC.cn) Sottocondizione.DataSource = cmd.ExecuteReader() Sottocondizione.DataTextField = "Sottocondizione" Sottocondizione.DataValueField = "IDSottocondizione" Sottocondizione.DataBind() Sottocondizione.Dispose() LC.cn.Close() End Sub Sub SottoCondizione_SelectedIndexChanged() End Sub

    <table>
     <tr><td width="300">Condizione:</td><td><asp:DropDownList ID="Condizione" runat="server" AutoPostBack="true"  onselectedindexchanged="Condizione_SelectedIndexChanged" ></asp:DropDownList></td></tr>
     <tr><td width="300">Specifica:</td><td><asp:DropDownList ID="Sottocondizione" onselectedindexchanged="SottoCondizione_SelectedIndexChanged" runat="server" AutoPostBack="true" ></asp:DropDownList></td></tr>
    </table>
    Ho riprodotto il tutto e ho lo stesso problema, quando modifico la sottocondizione , la stessa si ripopola riportandola al valore iniziale

  • giovedì 10 maggio 2012 11:16
    Postatore
     
     

    Sicuro che il campo IDSottocondizione sia una chiave univoca della tabella? Perché ASP .NET, per ripristinare il valore selezionato, va a controllare la proprietà SelectedValue, quindi se ci sono due o più righe con lo stesso valore, dopo il PostBack ti verrà sempre selezionata la prima con tale ID.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 10 maggio 2012 11:55
     
     

    allora marco, ho fatto diversi tentativi e ti dico per certo che:

    una volta selezionato il valore della ddl sottocondizione, viene rieseguito l'evento l'evento Condizione_SelectedIndexChanged che a sua volta ripopola la sottocondiziona che il cui valore si riposiziona sul primo.

    nota che ho provato anche questa:

    Protected Sub Condizione_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            If IsPostBack = True Then MsgBox("post")
            RiempiSottoCondizione(Condizione.SelectedValue)
        End Sub

    e dopo la prima seleziona del ddl sottocondizione ho il messaggio  MsgBox("post")

  • giovedì 10 maggio 2012 12:07
     
     
    Entrambe le dprop hanno lo stesso problema

    Bene, ora il problema sembra essere solo nell'ultima.

    Ho riprodotto il tutto e ho lo stesso problema, quando modifico la sottocondizione , la stessa si ripopola riportandola al valore iniziale

    Questo è strano. controlla che dopo la selezione di un valore della DDL SottoDelezione, non ricarichi nulla, ovvero non deve passare dal "riempi" (per indenterci), e da nessun altro evento.

    Postato da www.cmsaspnet.com
    Devi disabilitare il viewstate e ogni volta ripopolare la lista, e mentre lo fai settare l'elemento selected.. giusto a titolo di esempio guarda:

    Non mi sembra affatto la soluzione giusta.


    Programamtore ASP.NET
    http://glucolo.wordpress.com

  • giovedì 10 maggio 2012 12:23
     
     

    Ho visto la cosa anche assieme ad un mio collega ma il comportamento è veramente anomalo, vi posto le due paginette per fare un test

    scaricate da qui

    chiaramente ho modificato nella classe i dati di accesso al db, quindo dovrete reinserire i vostri.

  • giovedì 10 maggio 2012 12:57
    Postatore
     
     

    Nell'applicazione che hai postato, le DropDownList non vengono proprio popolate :-)

    Ho ripreso quindi il codice che avevi postato in precedenza ed ho verificato il funzionamento del sistema. Quando cambio il valore in Sottocondizione, l'evento Condizione_SelectedIndexChanged non viene assolutamente eseguito. L'unico caso in cui, dopo il postback, il valore selezionato si perde è, come ti dicevo prima, se nella lista Condizione ci sono due o più elementi con lo stesso value e tu selezioni uno di questi (in tal caso, infatti, ASP .NET non sa più quale ripristinare).


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 10 maggio 2012 13:01
     
     
    aspetta controllo forse ho modificato qulcosa col collega
  • giovedì 10 maggio 2012 13:02
     
     
    ho inserito un button che popola la prima ddl, per staccarlo dal form_load, ma il concetto è lo stesso.
  • giovedì 10 maggio 2012 13:03
     
      Contiene codice
        
    <table>
     <tr><td width="300">Condizione:</td><td><asp:DropDownList ID="Condizione" runat="server" AutoPostBack="true"  onselectedindexchanged="Condizione_SelectedIndexChanged" ></asp:DropDownList></td></tr>
     <tr><td width="300">Specifica:</td><td><asp:DropDownList ID="Sottocondizione" onselectedindexchanged="SottoCondizione_SelectedIndexChanged" runat="server" AutoPostBack="true"  ></asp:DropDownList></td></tr>
    </table>
    
        <asp:Button ID="Button1" runat="server" Text="Button" />
    
    

  • giovedì 10 maggio 2012 13:04
     
      Contiene codice
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Drawing
    Imports System.Collections
    Imports System.IO
    
    Partial Class Default2
        Inherits System.Web.UI.Page
    
        Dim LC As New LumaxClass
        Dim dap As SqlDataAdapter
        Dim dst As DataSet
        Dim dstCarrello As DataSet
        Dim cmd As SqlCommand
        Dim Nome As String
        Dim sql As String
    
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    
            If Not IsPostBack Then
                MsgBox("load-postback")
            End If
    
        End Sub
    
        Protected Sub Condizione_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            If IsPostBack = True Then MsgBox("post")
            'MsgBox("prova")
            RiempiSottoCondizione(Condizione.SelectedValue)
        End Sub
    
        Sub RiempiSottoCondizione(ByVal Condizione As Integer)
            'Sottocondizione.Items.Clear()
            LC.cn.Open()
            sql = "select * from Vista_IMU_Aliquote where IDCondizione=" & Condizione
            cmd = New SqlCommand(sql, LC.cn)
            Sottocondizione.DataSource = cmd.ExecuteReader()
            Sottocondizione.DataTextField = "Sottocondizione"
            Sottocondizione.DataValueField = "IDSottocondizione"
            Sottocondizione.DataBind()
            Sottocondizione.Dispose()
            LC.cn.Close()
        End Sub
    
        Sub SottoCondizione_SelectedIndexChanged()
    
        End Sub
    
        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            LC.cn.Open()
            cmd = New SqlCommand("select * from Vista_Oggetti_Condizioni  order by Condizione", LC.cn)
            Condizione.DataSource = cmd.ExecuteReader()
            Condizione.DataTextField = "Condizione"
            Condizione.DataValueField = "IDCondizione"
            Condizione.DataBind()
            Condizione.Dispose()
            LC.cn.Close()
            Condizione.SelectedValue = 2
            RiempiSottoCondizione(Condizione.SelectedValue)
        End Sub
    
    End Class
    questo è il tutto
  • giovedì 10 maggio 2012 13:07
    Postatore
     
     
    OK, però non hai risposto alla domanda che ti ho fatto prima, ovvero se sei sicuro che nella DropDownList Sottocondizione, i valori corrispondenti alla proprietà DataValueField IDSottocondizione siano univoci.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 10 maggio 2012 13:17
     
     
    si 100% sono 20 righe e l'idSottocondizione è un numero in questo caso da 1 a 20 senza doppi
  • giovedì 10 maggio 2012 13:21
     
     

    se scelgo prima il valore da condizioni, mi aggiorna sottocondizioni e tutto va bene

    se il valore di condizioni glielo assegno da codice come in questo caso, ottengo l'anomalia riscontrata

  • giovedì 10 maggio 2012 13:37
     
     

    potete vedere l'esempio di ciò che succede qui

  • giovedì 10 maggio 2012 14:07
     
      Contiene codice

    così risolverei il problema:

    Protected Sub Condizione_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Condizione.SelectedIndexChanged
            If IsPostBack = True Then Exit Sub
            'MsgBox("prova")
            RiempiSottoCondizione(Condizione.SelectedValue)
        End Sub

    ma non capisco la motivazione, e non mi sembra un metodo molto corretto.

  • giovedì 10 maggio 2012 14:14
     
     
    risolvo il problema della seconda casella, ma ora non funziona più la prima. che guaio!!!!!
  • giovedì 10 maggio 2012 14:36
    Postatore
     
     

    Prova a mettere punti di interruzione all'inizio di tutti i metodi che hai nel code-behind, e così verifica come vengono richiamati quando selezioni qualcosa nelle DropDownList.

    Fai un'esecuzione passo-passo del codice per capire qual è il flusso di esecuzione.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 10 maggio 2012 16:00
     
     

    Allora si verifica questo:

    clicco button :

    riempie Condizione

    riempie sottocondizione

    Scelgo un valore da sottocondizione:

    Passa sull'evento load (bypassato dal postback)

    esegue l'evento di condizione (qui c'è l'anomalia, perche ripopola sottocondizione)

  • giovedì 10 maggio 2012 16:30
     
      Contiene codice

    credo di aver capito il problema:

    è qui: 

    Condizione.SelectedValue = 2

    lui imposta il selectvalue della ddl condizione , ma non ne esegue la funzione

    Condizione_SelectedIndexChanged

    che avvia all'evento successivo, come se rimanesse sospesa.

  • venerdì 11 maggio 2012 08:58
     
     Con risposta Contiene codice

    Allora mi sembra chiaro che il problema è nell'associazione di dati, sono giunto alla conclusione che la problematica sta nel popolamento della ddl col databind, in effetti col seguente sistema tuttu funziona correttamente:

     cmd = New SqlCommand("select * from Condizioni", LC.cn)
            dst = New DataSet
            dap = New SqlDataAdapter()
            dap.SelectCommand = cmd
            dap.Fill(dst, "Clienti")
    
            For x = 0 To dst.Tables("Clienti").Rows.Count - 1
                With dst.Tables("Clienti").Rows(x)
                    Condizione.Items.Add(New ListItem(.Item("Condizione"), x))
                End With
            Next
            Condizione.SelectedValue = 2
            
            RiempiSottoCondizione(Condizione.SelectedValue)
          

    Comunque ho utilizzato il combolist della telerik che funziona regolarmente anche col databind.

    • Contrassegnato come risposta Massimo74rn venerdì 11 maggio 2012 08:58
    •