У меня проблемы с получением входных значений динамически созданных элементов управления в ListView.
Вот мой ListView:
<asp:ListView ID="lvQuestions" runat="server" DataKeyNames="ProductQuestionId" onitemdatabound="lvQuestions_ItemDataBound">
<LayoutTemplate>
<table>
<tr runat="server" id="itemPlaceholder"></tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Question") %></td>
<td>
<asp:PlaceHolder ID="plControl" runat="server" />
<asp:HiddenField ID="hfQuestionId" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" />
В моем обработчике ItemDataBound я добавляю TextBox или другой элемент управления в Placeholder. Тип элемента управления зависит от элемента, но для простоты предположим, что это всегда текстовое поле. Идентификатор элемента управления также является динамическим.
// create a textbox control
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + productQuestionId.ToString(); //productQuestionId is the datakey value of this ListViewItem
placeholder.Controls.Add(txtbx);
Когда пользователь нажимает на кнопку, мне нужно получить заполненные значения.
В своем исследовании я обнаружил, что мне нужно сначала воссоздать динамически добавленные элементы управления, чтобы получить их значения из-за жизненного цикла страницы.
Вот что у меня в обработчике кнопок для воссоздания элементов управления:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + hdField.Value;
plcHolder.Controls.Add(txtbx);
}
затем следующий блок кода в том же обработчике я повторяю через ListViewDataItems и нахожу элемент управления:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = (TextBox)plcHolder.FindControl("txtQuestion_" + hdField.Value);
if (txtbx != null)
{
Response.Write("TextBox Found:" + txtbx.Text);
}
}
Текстовое поле найдено, но значения нет. Как будто я только что написал над текстовыми полями с новыми в предыдущем блоке. Если я удалю предыдущий блок кода, текстовые поля не будут найдены.
Может кто-нибудь помочь мне с тем, что мне здесь не хватает?
Спасибо.