2009-03-03 14 views
5

Sembra questa domanda was addressed here, ma la sua soluzione non ha funzionato per me. Sto creando un sistema di menu a discesa dinamico che compila un elenco a discesa secondario con i risultati di una query basata sull'elemento selezionato nel primo elenco a discesa.DropDownList Valore SelectedIndex non aggiornato su AutoPostback

Prima discesa sempre popolato:

Dim db As New linqclassesDataContext 
Dim categories = (From c In db.faq_cats) 

NewFaqDropDownCategory.DataSource = categories 
NewFaqDropDownCategory.DataTextField = "category" 
NewFaqDropDownCategory.DataValueField = "category_id" 
NewFaqDropDownCategory.DataBind() 
Unset(categories) 
Unset(db) 

Seconda discesa sempre popolato:

Protected Sub NewFaqDropDownCategory_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim temp As Integer = CInt(Val(NewFaqDropDownCategory.SelectedIndex)) 
    MsgBox(theDrop.SelectedValue) 
    Return 

    'Dim db As New linqclassesDataContext 
    'Dim faqs = (From f In db.faqs Where f.category = NewFaqDropDownCategory.SelectedValue) 

    'NewFaqDropDownList.DataSource = faqs 
    'NewFaqDropDownList.DataTextField = "question" 
    'NewFaqDropDownList.DataValueField = "id" 
    'NewFaqDropDownList.DataBind() 
    'NewFaqLabel.Visible = True 
    'NewFaqDropDownList.Visible = True 
    'Unset(faqs) 
    'Unset(db) 
End Sub 

Il markup per la prima discesa ...

<asp:DropDownList ID="NewFaqDropDownCategory" AutoPostBack="true" runat="server" OnSelectedIndexChanged="NewFaqDropDownCategory_SelectedIndexChanged"> 
</asp:DropDownList> 

E la seconda ...

<asp:DropDownList ID="NewFaqDropDownList" runat="server" Visible="false"> 
</asp:DropDownList> 

Non importa quello che ho provato, ottengo sempre "1" (il valore del primo elemento nel secondo menu a discesa). Il post che ho citato in precedenza diceva che questo era dovuto a AutoPostBack e il server non sapeva che l'elenco era stato aggiornato.

Qualcuno può chiarire questo per me un po 'di più?

risposta

8

Imposta un punto di interruzione sulla riga che legge: NewFaqDropDownCategory.DataBind() e uno nel gestore di eventi (NewFaqDropDownCategory_SelectedIndexChanged). Sospetto che il database sia chiamato prima che l'evento NewFaqDropDownCategory_SelectedIndexChanged si attivi causando la modifica del valore selezionato.

Se è così, è necessario sia per essere sicuri di solo databind se non si è nel bel mezzo della vostra AutoPostBack o invece di utilizzare NewFaqDropDownCategory.SelectedIndex sulla prima riga del vostro gestore di eventi è possibile lanciare il parametro mittente di un DropDownList e usa il suo valore selezionato.

+0

ah ah! avevi assolutamente ragione. Ho inserito la pausa, ho scoperto che veniva effettivamente chiamato prima che l'evento sparasse. Ho avvolto il DataBind in un condizionale se non page.ispostback, e questo ha risolto il problema! Grazie! – Anders

+2

Yay, la mia verginità SO è persa con la mia prima risposta accettata :) – grenade

0

penso che ci sia un bug nella query LINQ per la seconda casella a

Dim faqs = (From f In db.faqs Where f.category = NewFaqDropDownCategory.SelectedValue) 

Qui si confrontano SelectedValue alla categoria verso il basso. Eppure nella prima casella combinata hai detto che DataValueField dovrebbe essere category_id. Prova a cambiare f.category in f.category_id

2

Ho avuto lo stesso problema. Trovato ho dimenticato di guardare se stavo postando alla pagina o no e stavo legando il mio controllo DropDownList nell'evento Page_Load della pagina. Mi ero dimenticato di usare:

if (!IsPostBack) 
{ 
    .... do databind .... 
} 
Problemi correlati