Hallo,
in meinem ASP.NET-Projekt verwende ich eine MultiView auf einem ASCX-Control für die Einstellungsseite. Auf diesem MultiView gibt es mehrere Gruppen von Einstellungen, deswegen habe ich den Einstellungsdialog selbst wieder in ein WebUserControl (SettingsPanel) ausgelagert.
Wenn die entsprechende Seite des MultiView nun angewählt wird, wird eine Methode des SettingsPanel-UserControl aufgerufen, das mir die Profilfragen und -einstellungen dynamisch aus der Datenbank holt und dann alle Controls dynamisch erstellt, im Endeffekt kann ich dann über die Datenbank ganz einfach neue Profileinstellungen hinzufügen, wenn ich welche brauche.
Vorher hatte ich den ganzen Code in dem MultiView, da hat das einwandfrei funktioniert. Doch seitdem verdoppeln sich meine Einstellungen selbstständig, ein sehr seltsames Verhalten. Folgender Code erstellt meine Controls (sorry, muss leider VB.NET sein
)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Dim lastPrfId As Integer = -1 Dim selectionObject As Control = Nothing For Each antwort As NtagDataSet.ProfilFragenRow In dtProfile If (lastPrfId <> antwort.prf_id) Then ' Create new profile question If (Not String.IsNullOrEmpty(antwort.prf_frage)) Then Dim lbl As New Label() lbl.CssClass = "profileLabel" lbl.Text = antwort.prf_frage phProfile.Controls.Add(lbl) End If
lastPrfId = antwort.prf_id 'Hier wird abhängig vom Fragentyp eine RadioButtonList, CheckBoxList, DropDownList oder eine TextBox erstellt selectionObject = CreateSelectionObject(antwort.prf_typ, antwort.prf_id) phProfile.Controls.Add(selectionObject) End If ' Add answer Dim AntwortText As String = "" If Not antwort.IsAntwortTextNull() Then AntwortText = antwort.AntwortText End If 'Hier wird eine Antwort abhängig vom obigen Typ hinzugefügt AddSelectionAnswer(selectionObject, antwort.prf_typ, antwort.pra_Antwort, antwort.pra_id, Not antwort.IsSelectedNull(), AntwortText) |
Wie man sieht, geht der Code durch das Ergebnis einer DB-Abfrage, die pro Datensatz eine Antwort inkl. der dazugehörigen Frage erstellt, deswegen ganz am Anfang die if-Abfrage, die dann ein neues Objekt erstellt. Diese Objekt wird dann dem PlaceHolder phProfile in die ControlsCollection hinzugefügt.
Beim Debuggen habe ich jetzt folgendes Phänomen festgestellt: Beim ersten Aufruf dieser Erstellung passt alles. Beim zweiten Aufruf jedoch hat das in CreateSelectionObject" erstellte Control bereits die vorher erstellten AntwortItems drin, wie gesagt, das Objekt ist neu erstellt!
Ich habe jetzt ein wenig probiert und herausgefunden, dass es wohl am ViewState liegt. Wenn ich jedoch vom PlaceHolder den ViewState deaktiviere, funktioniert diese Sache, aber ich hab noch einen Speichern-Button, bei dem will ich das Zeug eigentlich nicht noch einmal komplett neu erstellen.
Die Frage ist jedoch vor allem: Warum hab ich nach der Auslagerung in ein eigenes WebUserControl dieses Verhalten und vorher nicht?