Frage

Ich habe eine Seite, die einige dynamisch erstellten Steuerelemente (TextBox und Dropdownlist) enthält. Wenn ein Postback auftritt, halten die Textfelder ihre Werte, aber die Dropdownlists verlieren ihre Listitem. Das ist ziemlich verwirrend, da auch die Seitenebene Dropdown seine Listitem hält. Kann jemand sehen, was unten mit dem Code falsch?

Jede Hilfe dieses Problems bei der Lösung würde sehr geschätzt werden.

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      ddl.EnableViewState = True
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" enableviewstate="true">
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" EnableViewState="true" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>
War es hilfreich?

Lösung

Ich habe die Lösung gefunden, die mir den Ansichtszustand über Postbacks zu halten erlaubt. Es ist Trackviewstate des ItemCollection zu nennen.

CType(ddl.Items, IStateManager).TrackViewState()

Danke an alle für Ihre Hilfe.

Dies ist die Arbeitslösung:

<%@ Page Language="VB"%>

<script runat="server">
  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not Page.IsPostBack Then
      ddlFixed.Items.Add(New ListItem("12", "13"))
      ddlFixed.Items.Add(New ListItem("14", "15"))
    End If
    Dim i As Integer
    For i = 0 To 3
      Dim ddl As New DropDownList
      ddl.ID = "ddlPage" & i
      CType(ddl.Items, IStateManager).TrackViewState()
      If Not Page.IsPostBack Then
        ddl.Items.Add(New ListItem("12", "13"))
        ddl.Items.Add(New ListItem("14", "15"))
      End If
      pnlDynamic.Controls.Add(ddl)
      Dim txtBx As New TextBox
      txtBx.ID = "txtPage" & i
      If Not Page.IsPostBack Then
        txtBx.Text = "Preset"
      End If
      pnlDynamic.Controls.Add(txtBx)
    Next
  End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server" >
  <div>
    <br />
    <br />
    <a href="Default.aspx">Get-Request</a>
    <br />
    <br />
    <asp:Panel runat="server" ID="pnlDynamic" />    
    <br />
    <br />
    <asp:DropDownList runat="server" ID="ddlFixed" />
    <asp:Button runat="server" ID="btn" Text="Postback"/>
  </div>
  </form>
</body>
</html>

Andere Tipps

Eine DDL wird seine Produkte und die Auswahl beibehalten, wenn Ansichtszustand aktiviert ist. Ein Feld wird sein Inhalt unabhängig von Ansichtszustand aufrechtzuerhalten, da die resultierende HTML-Datei auf einem Postback an den Server zurückgeschrieben.

Ich finde es Courious dass Sie alle diese Ansichtszustand Anweisungen in Ihrem Code und Markup haben.

Ein von mehreren Dingen passiert:

  1. Viewstate an der Steuerung ist deaktiviert
  2. Viewstate über dem contrl Hierachie ist deaktiviert (Seite, Form, Panel)
  3. Sie fügen dynamisch die Steuerung zu spät im Zyklus Seite für die Auswahl von Ansichtszustand geladen werden. Laden in INIT sollte in Ordnung sein.

Auch Sie explizit müssen sein, um die Viewstate für die Dropdownlists aktivieren ...

EDIT: Das ist, was ich mit meinem letzten Kommentar bedeuten ...

    <script runat="server">
      Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not Page.IsPostBack Then
          ddlFixed.Items.Add(New ListItem("12", "13"))
          ddlFixed.Items.Add(New ListItem("14", "15"))

          Dim i As Integer
          For i = 0 To 3
            Dim ddl As New DropDownList
            ddl.ID = "ddlPage" & i
            ddl.EnableViewState = True
            ddl.Items.Add(New ListItem("12", "13"))
            ddl.Items.Add(New ListItem("14", "15"))

            pnlDynamic.Controls.Add(ddl)
            Dim txtBx As New TextBox
            txtBx.ID = "txtPage" & i
            txtBx.Text = "Preset"
            pnlDynamic.Controls.Add(txtBx)
          Next
        End If
      End Sub
   </script>

Ich benutze Page_Load immer und nie Probleme wie diese haben. Vielleicht etwas, das Sie könnten betrachten.

ich in der Regel binden Daten steuert das erste Mal die Seite geladen wird, und danach lassen Viewstate Postbacks behandeln usw. Beachten Sie, dass sie vorschlagen, dass Sie Daten binden während Page_Load ...

Schauen Sie sich http://support.microsoft.com/kb/305141

Seite Veranstaltungen                 loadTOCNode (2, 'Moreinformation');              Während des gesamten Lebenszyklus einer ASP.NET-Seite, ein paar Standardereignisse           , die von der Seite Objekt ausgesetzt häufig verwendet werden. Der ASP.NET-Framework           automatisch eine Verbindung mit (oder Drähten up) geeignete Delegierten Fälle zur Lauf           Zeit für diese Methoden. Dies erspart Sie, den notwendigen „Klebstoff zu schreiben           Code.“Die folgende Liste stellt die Delegierten-Instanzen, die bei verdrahtet werden           Laufzeit in der Reihenfolge, in der sie abgefeuert werden:           
  • Page_Init : Während dieser Veranstaltung können Sie Werte initialisieren, oder schließen Sie eine beliebige                 Event-Handler, die Sie haben
  • Page_Load :. Während dieser Veranstaltung können Sie eine Reihe von Aktionen durchführen, um entweder                 Erstellen Sie Ihre ASP.NET-Seite zum ersten Mal oder reagieren Ereignisse auf Client-Seite                 das Ergebnis von einer Post. Die Seite und Kontrollansichtszustand wurde restauriert                 vor diesem Ereignis. Verwenden Sie die IsPostBack Eigenschaft zu prüfen, ob dies ist das erste Mal, dass die                 Seite bearbeitet wird. Wenn es das erste Mal ist, führt die Datenbindung. Ebenfalls,                 lesen und Steuerungseigenschaften aktualisieren
  • Page_DataBind . DataBind Ereignis wird ausgelöst, wenn die DataBind Methode auf der Seite aufgerufen wird Niveau. Wenn Sie rufen Sie DataBind zu den einzelnen Kontrollen, feuert sie nur die DataBind Ereignis der Kontrollen darunter
  • Page_PreRender .: das PreRender Ereignis ausgelöst wird, kurz bevor der Ansichtszustand gespeichert und die                 Kontrollen gemacht werden. Sie können dieses Ereignis verwenden, jede Last-Minute ausführen                 Operationen auf Ihren Kontrollen
  • Page_Unload :. Nach einer Seitendarstellung, die Page_Unload Ereignis ausgelöst wird beendet. Diese Veranstaltung ist ein guter Ort, um endgültige Bereinigung durchführen                 Arbeit. Dazu gehören Elemente wie die Bereinigung offener Datenbankverbindungen,                 Verwerfen Objekte oder diese Dateien zu schließen, die geöffnet sind.
Die folgende Liste führt die Ereignisse, die sind           nicht-deterministisch:           
  • Page_Error : Wenn eine nicht behandelte Ausnahme während der Seitenverarbeitung erfolgt, die Fehler Ereignis ausgelöst wird. Die Fehler Veranstaltung bietet Ihnen die Möglichkeit, anmutig Griff                 Fehler
  • Page_AbortTransaction . Transaktion Ereignisse sind nützlich, wenn Sie, ob eine Transaktion angeben mögen                 gelingt oder scheitert. Dieses Ereignis wird für den Warenkorb Szenarien häufig verwendet in                 die dieses Ereignis den Erfolg oder Misserfolg einer Bestellung anzeigen. Diese Veranstaltung                 wird ausgelöst, wenn eine Transaktion abgebrochen wurde,
  • Page_CommitTransaction :. Dieses Ereignis wird ausgelöst, wenn eine Transaktion festgeschrieben wurde                 erfolgreich.

Die Listenelemente in einer Dropdownlist sind nicht im Ansichtszustand gespeichert. Sie finden sie auf jedem Postback hinzufügen.

Was im Ansichtszustand gespeichert wird der ausgewählte Index - dh. der ‚Wert‘ der Steuerung.

Edit: Nun, es scheint, dass ich heute etwas gelernt. Ich stehe korrigiert: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top