Динамически создаваемый DropDownList теряет ListItems при обратной передаче
-
05-07-2019 - |
Вопрос
У меня есть страница, которая содержит некоторые динамически созданные элементы управления (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 для этих 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 не сохраняются в состоянии просмотра. Вы должны будете добавлять их на каждый постбэк.
В состоянии просмотра хранится выбранный индекс, т.е. «значение» элемента управления.
Редактировать . Кажется, сегодня я кое-что узнал. Я стою исправлено: -)