2009-03-03 13 views
5

Es sieht aus wie diese Frage was addressed here, aber seine Lösung hat nicht für mich arbeiten. Ich erstelle ein dynamisches Dropdown-Menüsystem, das eine sekundäre Dropdown-Liste mit den Ergebnissen einer Abfrage basierend auf dem ausgewählten Element im ersten Dropdown-Feld füllt.DropDownList SelectedIndex Wert nicht auf AutoPostback

Erste Dropdown bevölkert zu werden:

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) 

Zweiter Dropdown bevölkert zu werden:

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 

Das Markup für den ersten Drop-Down ...

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

Und die zweiten ...

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

Egal, was ich versucht habe, bekomme ich immer "1" (der Wert des ersten Elements im zweiten Dropdown). Der Post, auf den ich zuvor hingewiesen habe, sagte, dass dies mit AutoPostBack zu tun hatte und der Server nicht wusste, dass die Liste noch aktualisiert wurde.

Kann jemand dies für mich ein wenig mehr klären?

Antwort

8

Legen Sie einen Unterbrechungspunkt in der Zeile fest, die lautet: NewFaqDropDownCategory.DataBind() und eine in Ihrem Ereignishandler (NewFaqDropDownCategory_SelectedIndexChanged). Ich vermute, dass die Datenbank gerade aufgerufen wird, bevor Ihr NewFaqDropDownCategory_SelectedIndexChanged-Ereignis ausgelöst wird, was dazu führt, dass sich der ausgewählte Wert ändert.

Wenn dies der Fall ist, müssen Sie entweder sicherstellen, dass Sie nur Datenbind wenn Sie nicht in der Mitte Ihres Autopostback sind oder anstelle von NewFaqDropDownCategory.SelectedIndex in der ersten Zeile des Ereignishandlers können Sie den Absenderparameter zu a DropDownList und verwende den ausgewählten Wert.

+0

ah hah! Du hattest absolut recht. Ich habe die Pause dort hineingelegt und herausgefunden, dass sie tatsächlich gerufen wurde, kurz bevor das Ereignis ausgelöst wurde. Ich wickelte den DataBind in eine wenn nicht page.ispostback Bedingung, und das reparierte es! Vielen Dank! – Anders

+2

Yay, meine SO Jungfräulichkeit ist mit meiner ersten akzeptierten Antwort verloren :) – grenade

0

Ich denke, es ist ein Fehler in der LINQ-Abfrage für das zweite Dropdown-Feld ist

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

Hier können Sie SelectedValue zur Kategorie vergleichen. In der ersten Combobox haben Sie jedoch angegeben, dass das DataValueField category_id sein sollte. Versuchen Sie, f.category in f.category_id zu ändern

2

Ich hatte das gleiche Problem. Ich habe vergessen zu sehen, ob ich auf die Seite zurückgebe oder nicht, und ich habe mein DropDownList-Steuerelement im Page_Load-Ereignis der Seite gebunden. Ich hatte vergessen zu verwenden:

if (!IsPostBack) 
{ 
    .... do databind .... 
} 
Verwandte Themen