2016-04-16 23 views
2

EDIT: Es war DropDownList.Items.Clear(); in einer Methode, wo ich einige Sachen aus db aufgelistet, die das Problem verursacht. Ich verstehe jedoch nicht, warum dies das Problem verursachen würde. Ich würde wirklich schätzen, wenn ich eine Erklärung geben könnte, da ich Items.Clear() wirklich verwenden muss; irgendwieUpdatePanel mit mehreren DropDownList

Ich habe 3 DropDownList, wo ich ein bestimmtes Etikett je nachdem, welchen Wert ich innerhalb einer dieser 3 DropDownList auswählen. Jeder DropDownList funktioniert gut, bis ich den nächsten auswählen, und die anderen vor es wird nicht über UpdatePanel auslösen.

z. Der erste funktioniert, hört aber auf zu arbeiten (das Etikett wird nicht mehr aktualisiert), sobald ich den zweiten benutze. Die zweite funktioniert, aber sobald dritte DropDownList verwendet wird, funktioniert die zweite nicht, und nur die dritte DropDownList funktioniert gut.

Das gleiche gilt, wenn ich sofort die dritte, die erste und zweite DropDownList nicht über UpdatePanel arbeiten.

Mit anderen Worten, sobald die neueste DropDownList verwendet wird, wird jede DropDownList vor es nicht über UpdatePanel auslösen.

aspx:

<asp:DropDownList ID="dpl1" runat="server" OnSelectedIndexChanged="dpl1_OnSelectedIndexChanged" AutoPostBack="True" /> 
<asp:DropDownList ID="dpl2" runat="server" OnSelectedIndexChanged="dpl2_OnSelectedIndexChanged" AutoPostBack="True" /> 
<asp:DropDownList ID="dpl3" runat="server" OnSelectedIndexChanged="dpl3_OnSelectedIndexChanged" AutoPostBack="True" /> 

<asp:UpdatePanel runat="server" ID="UpdatePanel" UpdateMode="Conditional" > 
    <ContentTemplate> 
    <asp:Label ID="lblDPB" runat="server"/> 
    </ContentTemplate> 

    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="dpl1" EventName="SelectedIndexChanged" /> 
     <asp:AsyncPostBackTrigger ControlID="dpl2" EventName="SelectedIndexChanged" /> 
     <asp:AsyncPostBackTrigger ControlID="dpl3" EventName="SelectedIndexChanged" /> 
    </Triggers> 
</asp:UpdatePanel> 

-Code hinter:

protected void dpl1_OnSelectedIndexChanged(object sender, EventArgs e) { 

     lblDPB.Text = "#1: "; 
    } 

    protected void dpl2_OnSelectedIndexChanged(object sender, EventArgs e) { 
     lblDPB.Text = "#2: "; 
    } 

    protected void dpl3_OnSelectedIndexChanged(object sender, EventArgs e) 
    { 
     lblDPB.Text = "#3: ";   
    } 

Wie kann ich alle diese drei Werke gleichzeitig machen?

Dank

+0

setzen Ich kann das Problem nicht reproduzieren. Ich sehe die richtige Listennummer, wenn ich irgendeine von ihnen auswähle, in beliebiger Reihenfolge. Ich fülle die Listen in 'Page_Load' (ich weiß nicht, wie deine gefüllt sind). Ist das ein kleiner Teil einer komplizierteren Form? Wenn ja, könnten Sie diesen Teil in einem kleinen Testprojekt testen. Tritt das Problem übrigens auf, wenn Sie 5 Sekunden zwischen Ihren Aktionen warten? – ConnorsFan

+0

@ConnorsFan hmm komisch .. Es funktionierte auch für mich, als ich einfach einige Sachen in Page_Load aufgelistet habe. In meinem Code habe ich einige Werte von db zu dropdownlist über eine Methode hinzugefügt, this.PreRender + = MethodName in Page_Load. Es ist zu viel Code, um hier hinzuzufügen, aber was könnte meinen Code möglicherweise Fehler? Ich habe einfach mit db (mit OleDb) verbunden, Sachen in jede DropDownList hinzugefügt und die Verbindung in diesem "MethodName" geschlossen. Übrigens, ich habe über 5 Sekunden gewartet, immer noch das gleiche Problem. – Nyprez

+0

EDIT: Okay, ich habe das Problem gefunden, am Anfang von "MethodName" habe ich Items.Clear für jede DropDownList bekommen, warum verursacht das das Problem? – Nyprez

Antwort

1

Clearing und die Dropdownlist bevöl auf jeder Postbacks die Auswahl in der Liste vermasselt. Der Aufruf Items.Clear() leert die SelectedValue und setzt die SelectedIndex auf -1. Nach dem Füllen der Liste wird der erste Eintrag ausgewählt. All diese Verarbeitung führt dazu, dass das Ereignis SelectedIndexChanged in unerwarteten Momenten ausgelöst wird.

Eine Möglichkeit, dieses Problem zu vermeiden, ist die ausgewählten Werte speichern Items.Clear() vor dem Aufruf, und sie zu setzen zurück, nachdem die Listen Nachfüllen:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 

    string val1 = dpl1.SelectedValue; 
    string val2 = dpl2.SelectedValue; 
    string val3 = dpl3.SelectedValue; 

    dpl1.Items.Clear(); 
    dpl2.Items.Clear(); 
    dpl3.Items.Clear(); 

    // Fill the lists here 

    SafeSelectValue(dpl1, val1); 
    SafeSelectValue(dpl2, val2); 
    SafeSelectValue(dpl3, val3); 
} 

private void SafeSelectValue(ListControl lst, string value) 
{ 
    // Makes sure that the value exists before selecting it 
    if (lst.Items.FindByValue(value) != null) 
    { 
     lst.SelectedValue = value; 
    } 
} 

By the way, um die Änderungen in den Listen zu sehen Artikel, ich musste die drei DropDownLists in ein UpdatePanel mit UpdateMode="Always":

+0

Nur eine Sache, ich habe vergessen zu erwähnen, dass meine DropDownList Inhalt Änderungen von der Suche nach db abhängen. Ich erhalte einen Fehler, wenn ich versuche, den Inhalt in dpl zu ändern. '' Dpl1 'hat einen SelectedValue, der ungültig ist, weil er in der Liste der Elemente nicht existiert. Parametername: value ". Die Lösung funktioniert gut, wenn sich der Inhalt nicht ändert, aber ich habe keine Ahnung, wie ich damit umgehen soll. Ich konnte keine richtige Lösung finden. – Nyprez

+0

Dieses Thema hat ein paar Wendungen, die es interessant machen. Ich habe meine Antwort aktualisiert. – ConnorsFan