La lista desplegable DropDownList creada dinámicamente pierde los elementos de lista en la devolución de datos

StackOverflow https://stackoverflow.com/questions/623611

Pregunta

Tengo una página que contiene algunos controles creados dinámicamente (TextBox y DropDownList). Cuando ocurre una devolución, los TextBox mantienen sus valores, pero las DropDownLists pierden sus ListItems. Esto es bastante confuso, ya que el nivel de página DropDownList también mantiene sus ListItems. ¿Alguien puede ver lo que está mal con el código de abajo?

Cualquier ayuda para resolver este problema sería muy apreciada.

<%@ 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>
¿Fue útil?

Solución

He encontrado la solución que me permitirá mantener el estado de visualización en las devoluciones de datos. Es para llamar a TrackViewState de ItemCollection.

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

Gracias a todos por su ayuda.

Esta es la solución de trabajo:

<%@ 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>

Otros consejos

Una DDL mantendrá sus elementos y su selección cuando se habilite viewstate. Un cuadro de texto mantendrá su contenido independientemente del estado de visualización, ya que el html resultante se vuelve a escribir en el servidor en una devolución de datos.

Me parece cortés que tengas todas estas declaraciones de estado de vista en tu código y marca.

Está ocurriendo una de varias cosas:

  1. ViewState en el control está deshabilitado
  2. ViewState sobre la jerarquía de control está deshabilitado (página, formulario, panel)
  3. Está agregando dinámicamente el control demasiado tarde en el ciclo de la página para que la selección se cargue desde viewstate. Cargar en INIT debería estar bien.

Puede ser que necesites activar explícitamente ViewState para esas DropDownLists ...

EDITAR: Esto es lo que quiero decir con mi último comentario ...

    <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>

Siempre uso Page_Load y nunca tengo problemas como este. Tal vez algo que puedas mirar.

Generalmente vinculo los datos a los controles la primera vez que se carga la página, y después de eso dejé que Viewstate maneje devoluciones de datos, etc. Tenga en cuenta que sugieren que vincule los datos durante Page_Load ...

Consulte http://support.microsoft.com/kb/305141

Page Eventos                 loadTOCNode (2, 'moreinformation');              Durante el ciclo de vida de una página ASP.NET, algunos eventos estándar           que se exponen desde el objeto Page se utilizan con frecuencia. El marco de la página ASP.NET           Se conecta automáticamente (o cablea) a las instancias de delegado apropiadas en ejecución           Tiempo para estos métodos. Esto le ahorra tener que escribir el pegamento " necesario           código " La siguiente lista presenta las instancias de delegado que están cableadas en           El tiempo de ejecución en el orden en que se disparan:           
  • Page_Init : Durante este evento, puede inicializar valores o conectar cualquier                 controladores de eventos que puede tener.
  • Page_Load : Durante este evento, puede realizar una serie de acciones para                 cree su página ASP.NET por primera vez o responda a eventos del lado del cliente                 ese resultado de una publicación. La página y el estado de vista de control han sido restaurados.                 antes de este evento. Utilice la propiedad de la página IsPostBack para comprobar si es la primera vez que                 La página se está procesando. Si es la primera vez, realice el enlace de datos. También,                 lea y actualice las propiedades de control.
  • Page_DataBind : el evento DataBind se activa cuando se llama al método DataBind en la página nivel. Si llama a DataBind en controles individuales, solo se activa el evento DataBind de los controles debajo de él.
  • Page_PreRender : El evento PreRender se activa justo antes de que se guarde el estado de vista y                 Los controles son renderizados. Puedes utilizar este evento para realizar cualquier último minuto.                 operaciones en sus controles.
  • Page_Unload : Después de que una página haya terminado de renderizarse, se activa el evento Page_Unload . Este evento es un buen lugar para realizar la limpieza final.                 trabajo. Esto incluye elementos como la limpieza de conexiones de base de datos abiertas,                 descartando objetos, o cerrando los archivos que están abiertos.
La siguiente lista resume los eventos que son           no determinista:           
  • Page_Error : si se produce una excepción no controlada durante el procesamiento de la página, se desencadena el evento Error . El evento Error te da la oportunidad de manejar con gracia                 errores.
  • Page_AbortTransaction : Transaction los eventos son útiles si desea indicar si una transacción                 tiene éxito o falla Este evento se usa comúnmente para escenarios de carro de compras en                 que este evento puede indicar el éxito o fracaso de un pedido. Este evento                 se activa cuando una transacción ha sido abortada.
  • Page_CommitTransaction : Este evento se activa cuando se ha confirmado una transacción                 con éxito.

Los elementos de la lista en un DropDownList no se almacenan en el estado de vista. Tendrás que agregarlos en cada devolución de datos.

Lo que está almacenado en el estado de vista es el índice seleccionado, es decir, el 'valor' del control.

Editar: Bueno, parece que aprendí algo hoy. Estoy corregido :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top