Динамически создаваемый DropDownList теряет ListItems при обратной передаче

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

Вопрос

У меня есть страница, которая содержит некоторые динамически созданные элементы управления (TextBox и DropDownList). Когда происходит обратная передача, TextBox сохраняют свои значения, но DropDownLists теряют свои ListItems. Это довольно запутанно, так как уровень страницы DropDownList также сохраняет свои ListItems. Кто-нибудь может увидеть, что не так с кодом ниже?

Любая помощь в решении этой проблемы будет принята с благодарностью.

<%@ 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>
Это было полезно?

Решение

Я нашел решение, которое позволит мне сохранять состояние просмотра в постбэках. Это для вызова TrackViewState из ItemCollection.

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

Спасибо всем за помощь.

Это рабочее решение:

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

Другие советы

DDL сохранит свои элементы и выбор, когда viewstate включен. Текстовое поле будет сохранять свое содержимое независимо от состояния представления, поскольку полученный HTML-файл записывается обратно на сервер при обратной передаче.

Я нахожу смелым, что в вашем коде и разметке есть все эти операторы viewstate.

Происходит одна из нескольких вещей:

<Ол>
  • ViewState в элементе управления отключен
  • ViewState над иерархией управления отключен (страница, форма, панель)
  • Вы динамически добавляете элемент управления слишком поздно в цикле страницы, чтобы выборка была загружена из состояния просмотра. Загрузка в INIT должна быть в порядке.
  • Может быть, вам нужно явно активировать ViewState для этих DropDownLists ...

    РЕДАКТИРОВАТЬ: Это то, что я имею в виду под моим последним комментарием ...

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

    Я всегда использую Page_Load и никогда не испытываю подобных проблем. Может быть, вы могли бы взглянуть.

    Обычно я связываю данные с элементами управления при первой загрузке страницы, и после этого пусть Viewstate обрабатывает обратные передачи и т. д. Обратите внимание, что они предлагают связывать данные во время Page_Load ...

    Ознакомьтесь с http://support.microsoft.com/kb/305141 . р>

    События страницы                 loadTOCNode (2, «moreinformation»);              В течение жизненного цикла страницы ASP.NET, несколько стандартных событий           которые выставляются из объекта Page , часто используются. ASP.NET рамки страницы           автоматически подключается (или подключается) к соответствующим экземплярам делегата при запуске           время для этих методов. Это избавляет вас от необходимости писать необходимый клей           . Код & Quot; В следующем списке представлены экземпляры делегатов, подключенные к           Время выполнения в том порядке, в котором они запущены:           
    • Page_Init : во время этого события вы можете инициализировать значения или подключить любое                 возможные обработчики событий.
    • Page_Load : во время этого события вы можете выполнить ряд действий для                 создать свою страницу ASP.NET в первый раз или ответить на события на стороне клиента                 этот результат из поста. Страница и состояние управления просмотром восстановлены                 до этого события. Используйте свойство страницы IsPostBack , чтобы проверить, выполняется ли это впервые                 страница обрабатывается. Если это первый раз, выполните привязку данных. Также,                 читать и обновлять свойства элемента управления.
    • Page_DataBind : событие DataBind возникает, когда на странице вызывается метод DataBind . уровень. Если вы вызываете DataBind для отдельных элементов управления, он запускает только событие DataBind для элементов управления под ним.
    • Page_PreRender : Событие PreRender наступает непосредственно перед сохранением состояния просмотра и                 элементы управления предоставляются. Вы можете использовать это событие, чтобы выполнить любую последнюю минуту                 операции над вашими элементами управления.
    • Page_Unload : после того как страница закончит рендеринг, возникает событие Page_Unload . Это событие является хорошим местом для проведения окончательной очистки                 Работа. Это включает в себя такие элементы, как очистка открытых подключений к базе данных,                 удаление объектов или закрытие открытых файлов.
    В следующем списке перечислены события, которые           недетерминирована:           
    • Page_Error : если во время обработки страницы возникает необработанное исключение, возникает событие Ошибка . Событие Ошибка дает вам возможность изящно обрабатывать                 ошибки.
    • Page_AbortTransaction : события Transaction полезны, если вы хотите указать, является ли транзакция                 успешно или неудачно. Это событие обычно используется для сценариев корзины покупок в                 какое это событие может указывать на успех или неудачу заказа. Это событие                 срабатывает, когда транзакция была прервана.
    • Page_CommitTransaction : это событие срабатывает, когда транзакция была совершена                 успешно.

    Элементы списка в DropDownList не сохраняются в состоянии просмотра. Вы должны будете добавлять их на каждый постбэк.

    В состоянии просмотра хранится выбранный индекс, т.е. «значение» элемента управления.

    Редактировать . Кажется, сегодня я кое-что узнал. Я стою исправлено: -)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top