dropdownlist .selectedvalue
-
mercoledì 9 maggio 2012 09:14
Mi si verifica questo problema:
sul postback dell'evento load assegno un valore alla dropdownlist:
If Not IsPostBack Then Nome.SelectedValue.Item("Nome") end ifquando 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:52NO, non cambia nulla
-
mercoledì 9 maggio 2012 10:20
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
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
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:19PostatoreCome e dove popoli la DropDownList in questione?
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
mercoledì 9 maggio 2012 12:23
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:29Postatore
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:
- come popoli la lista Condizione?
- 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
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 subEntrambe le dprop hanno lo stesso problema -
mercoledì 9 maggio 2012 12:51
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 Withquindi ho eliminato queste linee dalla sub Riempi:
Condizione.SelectedValue = .Item("IDCondizione") RiempiSottoCondizione(Condizione.SelectedValue) Sottocondizione.SelectedValue = .Item("IDSottoCondizione")
-
mercoledì 9 maggio 2012 13:19
Questa soluzione potrebbe esserti di aiuto?
http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx
Ulteriori riferimenti:
http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Walkthrough/CCDWithDB.aspx
http://www.asp.net/ajaxlibrary/act_CascadingDropdown.ashxProgramamtore ASP.NET
http://glucolo.wordpress.com -
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:34Postatore
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- Modificato Marco MinervaMicrosoft Community Contributor, Editor mercoledì 9 maggio 2012 13:34
-
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- Modificato Glauco Cucchiar mercoledì 9 maggio 2012 14:12
-
mercoledì 9 maggio 2012 14:12si 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
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:16Postatore
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 Sube 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
chiaramente ho modificato nella classe i dati di accesso al db, quindo dovrete reinserire i vostri.
-
giovedì 10 maggio 2012 12:57Postatore
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:01aspetta controllo forse ho modificato qulcosa col collega
-
giovedì 10 maggio 2012 13:02ho inserito un button che popola la prima ddl, per staccarlo dal form_load, ma il concetto è lo stesso.
-
giovedì 10 maggio 2012 13:03
<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
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 Classquesto è il tutto -
giovedì 10 maggio 2012 13:07PostatoreOK, 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:17si 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
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:14risolvo il problema della seconda casella, ma ora non funziona più la prima. che guaio!!!!!
-
giovedì 10 maggio 2012 14:36Postatore
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
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
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

