Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 12.12.08 09:55 
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 :()
ausblenden 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?
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 12.12.08 10:44 
So, hab ein bisschen was rausgefunden durch weiteres Debugging:

Beim zweiten Aufruf hat das ListControl (davon erben ja alle RadioButtonLists, CheckBoxLists usw) nach selectionObject = CreateSelectionObject(antwort.prf_typ, antwort.prf_id) keine Items.

Sobald es aber mittels phProfile.Controls.Add(selectionObject) zu den Controls des PlaceHolders hinzugefügt wurde, hat es genau die Anzahl Items, die beim ersten Aufruf drin sind. Auch der ViewState scheint das zu bestätigen und daher kommen die Dinger wahrscheinlich. Seltsamerweise bringt aber ein vorheriges Me.ViewState.Clear() rein gar nichts, es ändert sich nichts. Was ich sowieso drin habe, ist ein phProfile.Controls.Clear(), was mir aber offensichtlich den ViewState auch nicht ändert.

Helft einem Blinden bitte sehen ;)
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 12.12.08 11:03 
Hat sich wohl erledigt, die seltsamsten Dinge sind immer die mit der einfachsten Lösung. Hab mir die alte Implementation nochmal angeschaut und gesehen, dass ich dort die Erstellung im Page_Init-Event vorgenommen habe und in der neuen dann im Page_Load. Und im Hintergrund wurden die Elemente im ViewState gespeichert, der dann natürlich nach dem Hinzufügen meiner neu erstellten ListControl zu meinem PlaceHolder herging und die Items hinzufügte und damit hatte ich die Verdopplung.