selectedIndex ist verloren, während der postbacks - ASP.NET
Habe ich ein Listenfeld-Steuerelement:
<asp:ListBox runat="server" id="lbox" autoPostBack="true" />
Den code hinter ähnelt:
private void Page_Load(object sender, System.EventArgs e)
{
lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged);
if(!Page.IsPostBack)
{
LoadData();
}
}
private LoadData()
{
lbox.DataSource = foo();
lbox.DataBind();
}
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e)
{
int index = (sender as ListBox).selectedIndex;
}
Mein problem ist, dass wenn meine Seite erhält ein post zurück (wenn ein Benutzer eine Auswahl in der listbox), die Auswahl immer "springt", um das erste Element in der listbox, so dass die index-variable in meine callback-Funktion ist immer 0.
Scheint, so kann dies ein viewstate-problem? Wie kann ich es beheben, so dass der Auswahl-index bleibt durch das postback?
Es gibt keine ajax Los, das ist .NET 1.0.
Dank.
BEARBEITEN 1 JohnIdol bekommen hat mich einen Schritt näher, Wenn ich schalten Sie die datasource aus meiner ursprünglichen DataTable zu einer ArrayList, dann alles richtig funktionieren...was würde das verursachen?
Edit 2 Es stellt sich heraus, dass meine DataTable hatten mehrere Werte waren die gleichen, so dass die Indizes wurden so behandelt, als das gleiche wie alle Elemente mit dem gleichen Wert...danke an alle die geholfen haben!
froh zu sehen, Ihr problem ist gelöst
InformationsquelleAutor mmattax | 2008-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist die Ausgabe von foo () - Funktion aufrufen?
Auffüllen manuell im Listenfeld können Sie einstellen, Indizes, was Sie wollen (alle 0 zum Beispiel) - also das gleiche kann passieren, die Einstellung einer bestimmten dataSource unter bestimmten Umständen (die eine, die gibt Indizes nehme ich an). Wenn alle Element-Indizes sind 0 das Ergebnis ist, dass das SelectedIndexChanged-Ereignis nicht ausgelöst wird (index ändert sich nicht!) und alles ist Durcheinander: auf der post-zurück Auswahl zurück auf das erste Element in der Liste.
Das würde es erklären - ich kann nicht an nichts anderes denken - es ist in Ordnung für mich .NET 2.0 bin ich mit einer ArrayList mit strings um das Listenfeld zu füllen.
Nur so kann ich reproduzieren, das Problem ist die Einstellung aller Indizes zu 0.
Ich würde sagen, fügen Sie eine Uhr, um die "ListBox" und überprüfen Sie die Indizes zur Laufzeit, um sicherzustellen, dass Sie nicht alle null sein.
versuchen Sie es mit einer arraylist und sehen, was passiert, einfach aus Neugier. Stellen Sie sicher, dass die DataTable hat nur eine Spalte
Ich habe gerade versucht ein array-Liste, es funktioniert... nun brauche ich nur noch herausfinden, was falsch mit meinem datatable...aber es kommt direkt aus einer db-Abfrage... irgendwelche Ideen?
Ich denke, es hat mehr als eine Spalte und die zweite wird interpretiert als index (nicht versuchen noch). Haben Sie versuchen, fügen Sie eine Uhr, um das Listenfeld und haben einen Blick auf die Indizes? wenn Sie alle die gleichen, ist es
InformationsquelleAutor JohnIdol
Den real Problem hier ist die Reihenfolge der Ereignisse. Wenn Sie die databind-Methode page_load, die Sie überschreiben die geposteten Daten, das ist, warum die Auswahl wird nicht in der listbox. Sie können leicht zu überwinden diese durch das verschieben der Bindung Logik Page_Init.
InformationsquelleAutor davidfowl
wenn deine listbox-Elemente sind die gleichen und dann ausgewählten index erhalten auf 0 gesetzt.Zu berichtigen, setzen Sie verschiedene Werte zu
item.value
und lassenitem.text
bleibt die gleiche..dann ausgewählte index wird richtig angezeigt werden.InformationsquelleAutor Mohit
Databinding DropDownLists/Listboxen ist schmerzhaft, weil Sie oft binden Sie an die falschen Werte.
Habe ich aufgegeben auf die Verwendung von DataBind(), und nur in dem resort mit einer Foreach-Schleife:
InformationsquelleAutor FlySwat
Laden Sie die Daten in der Page_Init statt der Page_Load. Die Daten gefüllt werden, die während der Page_init zur Verfügung stehen in der PostBack.
InformationsquelleAutor Ben Lynch
Es sieht für mich so erstellen Sie einen neuen Event-Handler, die auf jeder Seite geladen werden. Könnte dies das problem verursacht. Warum nicht an den Event-Handler deklarativ:
auch, warum nicht auf die Steuerung direkt, statt Gießen?
Hinzufügen der Ereignis-listener nicht mein problem lösen...
In der Tat, ich habe den code zum erstellen der event-handler jedes mal und funktioniert alles. Nun, was ich wirklich Wunder ist, wer sind diese Menschen, die " down-vote Zeug die ganze Zeit? Ich bin ein bisschen krank - das ist nicht das erste mal, das ich verwendet habe, ein down-gevotet Lösung nur zu finden, es ist die beste Antwort.
InformationsquelleAutor HectorMac
Funktioniert bei mir auch. Hat Ihr foo() die Werte zurückgeben, jedes mal?
Nur als Anmerkung: wenn möglich, sollten Sie wirklich machen Sie Ihre databinding in OnInit (jedes mal, nicht nur auf Bekommt). Wenn Sie es tun, bevor der Aufruf von base.OnInit(...), die Inhalte der listbox nicht haben, werden Sie serialisiert und deserialisiert werden und von viewstate und über die Leitung gesendet, um dem client (ja, Sie werden schlagen die Datenbank mehr, aber Sie schlagen ein system, das sich auf Ihrem lokalen Subnetz oder sogar auf der gleichen Maschine. Darüber hinaus wird die Datenbank wahrscheinlich cache-Ergebnis).
Wenn Sie möchten, um zu bauen high-performance-websites, die Sie benötigen, zu nehmen einen näheren Blick auf die Art und Weise Sie ViewState. Ich empfehle diesen Artikel: WIRKLICH zu Verstehen, ViewState
Haben Sie das problem gelöst? Wenn ja, was war die Lösung?
Oh, never mind, ich sehe Sie schon gepostet habe die Lösung 🙂
InformationsquelleAutor Rune
Haben Sie sich Gedanken über das laden der Daten früher - z.B. in der OnInit-event auf der Seite/user control. Dies tritt auf, bevor die postback-Daten geladen wird und somit vor einem auf-ändern können verarbeitet werden? Ich glaube, dass sollte funktionieren - aber möchten Sie vielleicht deaktivieren Sie viewstate!
InformationsquelleAutor Jennifer
Ich weiß nicht, ob es einen Unterschied macht oder nicht, aber ich in der Regel befestigen Sie die Steuerelemente, um die Ereignisse auf der front-Seite und nicht im codebehind. In deinem Beispiel hätte ich das getan:
Andere als das, ich würde stellen Sie sicher, dass der ViewState aktiviert ist. ViewState kann ausgeschaltet werden an der Steuerung, Seite, & auch Website-Ebene.
InformationsquelleAutor Briggie Smalls